diff --git a/.gitignore b/.gitignore
index 974e4c8a..dc991b47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -426,7 +426,6 @@
 /third_party/yasm/source/patched-yasm
 /third_party/yasm/yasm.xml
 /tools/.bisect-builds-cache.json
-/tools/deps2git/
 /tools/distcc
 /tools/gn/bin/linux
 /tools/gn/bin/mac
diff --git a/AUTHORS b/AUTHORS
index 7f0279c..498f6aec 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -632,6 +632,7 @@
 Zhuoyu Qian <zhuoyu.qian@samsung.com>
 Ziran Sun <ziran.sun@samsung.com>
 Zoltan Herczeg <zherczeg.u-szeged@partner.samsung.com>
+Zoltan Kuscsik <zoltan.kuscsik@linaro.org>
 Zsolt Borbely <zsborbely.u-szeged@partner.samsung.com>
 Yongha Lee <yongha78.lee@samsung.com>
 方觉 (Fang Jue) <fangjue23303@gmail.com>
diff --git a/DEPS b/DEPS
index cbd9dbc..93227433 100644
--- a/DEPS
+++ b/DEPS
@@ -39,11 +39,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '236364904dda3e0b8c7b497adc32b026b0a640f6',
+  'skia_revision': '60029a5397f75aae4bdb994f26bd297edc3e433c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'd53b0abddddd1e86970ce3d2f2946eb57c6b2176',
+  'v8_revision': 'b3377cfcbfcdcaede329782eb135ebcbcf5a807f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -51,7 +51,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'a5f64de71469f43d7d67b816646c96509bc0df3f',
+  'angle_revision': '5576734a46f80bc8c5265cac9fb1af774b658d89',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -242,9 +242,6 @@
   'src/third_party/libphonenumber/src/resources':
     Var('chromium_git') + '/external/libphonenumber/resources.git' + '@' + 'b6dfdc7952571ff7ee72643cd88c988cbe966396',
 
-  'src/tools/deps2git':
-   Var('chromium_git') + '/chromium/tools/deps2git.git' + '@' + 'f04828eb0b5acd3e7ad983c024870f17f17b06d9',
-
   'src/third_party/webpagereplay':
    Var('chromium_git') + '/external/github.com/chromium/web-page-replay.git' + '@' + '7564939bdf6482d57b9bd5e9c931679f96d8cf75',
 
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 61d5f79..2c243784 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -29,7 +29,6 @@
 #include "components/navigation_interception/intercept_navigation_delegate.h"
 #include "content/public/browser/access_token_store.h"
 #include "content/public/browser/browser_message_filter.h"
-#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_security_policy.h"
 #include "content/public/browser/client_certificate_delegate.h"
 #include "content/public/browser/navigation_handle.h"
@@ -48,7 +47,6 @@
 #include "ui/base/resource/resource_bundle_android.h"
 #include "ui/resources/grit/ui_resources.h"
 
-using content::BrowserThread;
 using content::ResourceType;
 
 namespace android_webview {
@@ -62,16 +60,8 @@
   explicit AwContentsMessageFilter(int process_id);
 
   // BrowserMessageFilter methods.
-  void OverrideThreadForMessage(const IPC::Message& message,
-                                BrowserThread::ID* thread) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
-  void OnShouldOverrideUrlLoading(int routing_id,
-                                  const base::string16& url,
-                                  bool has_user_gesture,
-                                  bool is_redirect,
-                                  bool is_main_frame,
-                                  bool* ignore_navigation);
   void OnSubFrameCreated(int parent_render_frame_id, int child_render_frame_id);
 
 private:
@@ -90,45 +80,15 @@
 AwContentsMessageFilter::~AwContentsMessageFilter() {
 }
 
-void AwContentsMessageFilter::OverrideThreadForMessage(
-    const IPC::Message& message,
-    BrowserThread::ID* thread) {
-  if (message.type() == AwViewHostMsg_ShouldOverrideUrlLoading::ID) {
-    *thread = BrowserThread::UI;
-  }
-}
-
 bool AwContentsMessageFilter::OnMessageReceived(const IPC::Message& message) {
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(AwContentsMessageFilter, message)
-    IPC_MESSAGE_HANDLER(AwViewHostMsg_ShouldOverrideUrlLoading,
-                        OnShouldOverrideUrlLoading)
     IPC_MESSAGE_HANDLER(AwViewHostMsg_SubFrameCreated, OnSubFrameCreated)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
 }
 
-void AwContentsMessageFilter::OnShouldOverrideUrlLoading(
-    int render_frame_id,
-    const base::string16& url,
-    bool has_user_gesture,
-    bool is_redirect,
-    bool is_main_frame,
-    bool* ignore_navigation) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  *ignore_navigation = false;
-  AwContentsClientBridgeBase* client =
-      AwContentsClientBridgeBase::FromID(process_id_, render_frame_id);
-  if (client) {
-    *ignore_navigation = client->ShouldOverrideUrlLoading(
-        url, has_user_gesture, is_redirect, is_main_frame);
-  } else {
-    LOG(WARNING) << "Failed to find the associated render view host for url: "
-                 << url;
-  }
-}
-
 void AwContentsMessageFilter::OnSubFrameCreated(int parent_render_frame_id,
                                                 int child_render_frame_id) {
   AwContentsIoThreadClient::SubFrameCreated(
@@ -543,10 +503,10 @@
 AwContentBrowserClient::CreateThrottlesForNavigation(
     content::NavigationHandle* navigation_handle) {
   ScopedVector<content::NavigationThrottle> throttles;
-  // We allow intercepting only navigations within main frames. This
-  // is used to post onPageStarted. We handle shouldOverrideUrlLoading
-  // via a sync IPC.
-  if (navigation_handle->IsInMainFrame()) {
+  if (navigation_handle->IsInMainFrame() ||
+      (!navigation_handle->GetURL().SchemeIs(url::kHttpScheme) &&
+       !navigation_handle->GetURL().SchemeIs(url::kHttpsScheme) &&
+       !navigation_handle->GetURL().SchemeIs(url::kAboutScheme))) {
     throttles.push_back(
         navigation_interception::InterceptNavigationDelegate::CreateThrottleFor(
             navigation_handle)
diff --git a/android_webview/browser/aw_contents_client_bridge_base.h b/android_webview/browser/aw_contents_client_bridge_base.h
index 6ac592b9..9cd92063 100644
--- a/android_webview/browser/aw_contents_client_bridge_base.h
+++ b/android_webview/browser/aw_contents_client_bridge_base.h
@@ -62,11 +62,6 @@
       const base::string16& message_text,
       const content::JavaScriptDialogManager::DialogClosedCallback& callback)
       = 0;
-
-  virtual bool ShouldOverrideUrlLoading(const base::string16& url,
-                                        bool has_user_gesture,
-                                        bool is_redirect,
-                                        bool is_main_frame) = 0;
 };
 
 }  // namespace android_webview
diff --git a/android_webview/browser/net/android_stream_reader_url_request_job.cc b/android_webview/browser/net/android_stream_reader_url_request_job.cc
index dc288faa5..173bdbb 100644
--- a/android_webview/browser/net/android_stream_reader_url_request_job.cc
+++ b/android_webview/browser/net/android_stream_reader_url_request_job.cc
@@ -21,6 +21,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "net/base/io_buffer.h"
 #include "net/base/mime_util.h"
+#include "net/base/net_errors.h"
 #include "net/base/net_util.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
@@ -89,7 +90,6 @@
     net::NetworkDelegate* network_delegate,
     scoped_ptr<Delegate> delegate)
     : URLRequestJob(request, network_delegate),
-      range_parse_result_(net::OK),
       delegate_(delegate.Pass()),
       weak_factory_(this) {
   DCHECK(delegate_);
@@ -101,7 +101,6 @@
     scoped_ptr<DelegateObtainer> delegate_obtainer,
     bool)
     : URLRequestJob(request, network_delegate),
-      range_parse_result_(net::OK),
       delegate_obtainer_(delegate_obtainer.Pass()),
       weak_factory_(this) {
   DCHECK(delegate_obtainer_);
@@ -142,10 +141,7 @@
         base::Bind(&AndroidStreamReaderURLRequestJob::DelegateObtained,
                    weak_factory_.GetWeakPtr()));
   } else {
-    // Run DoStart asynchronously to avoid re-entering the delegate.
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(&AndroidStreamReaderURLRequestJob::DoStart,
-                              weak_factory_.GetWeakPtr()));
+    DoStart();
   }
 }
 
@@ -206,29 +202,45 @@
     set_expected_content_size(result);
     HeadersComplete(kHTTPOk, kHTTPOkText);
   } else {
-    NotifyStartError(
-        net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
   }
 }
 
 void AndroidStreamReaderURLRequestJob::OnReaderReadCompleted(int result) {
   DCHECK(thread_checker_.CalledOnValidThread());
-
-  ReadRawDataComplete(result);
+  // The URLRequest API contract requires that:
+  // * NotifyDone be called once, to set the status code, indicate the job is
+  //   finished (there will be no further IO),
+  // * NotifyReadComplete be called if false is returned from ReadRawData to
+  //   indicate that the IOBuffer will not be used by the job anymore.
+  // There might be multiple calls to ReadRawData (and thus multiple calls to
+  // NotifyReadComplete), which is why NotifyDone is called only on errors
+  // (result < 0) and end of data (result == 0).
+  if (result == 0) {
+    NotifyDone(net::URLRequestStatus());
+  } else if (result < 0) {
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+  } else {
+    // Clear the IO_PENDING status.
+    SetStatus(net::URLRequestStatus());
+  }
+  NotifyReadComplete(result);
 }
 
 base::TaskRunner* AndroidStreamReaderURLRequestJob::GetWorkerThreadRunner() {
   return static_cast<base::TaskRunner*>(BrowserThread::GetBlockingPool());
 }
 
-int AndroidStreamReaderURLRequestJob::ReadRawData(net::IOBuffer* dest,
-                                                  int dest_size) {
+bool AndroidStreamReaderURLRequestJob::ReadRawData(net::IOBuffer* dest,
+                                                   int dest_size,
+                                                   int* bytes_read) {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (!input_stream_reader_wrapper_.get()) {
     // This will happen if opening the InputStream fails in which case the
     // error is communicated by setting the HTTP response status header rather
     // than failing the request during the header fetch phase.
-    return 0;
+    *bytes_read = 0;
+    return true;
   }
 
   PostTaskAndReplyWithResult(
@@ -239,7 +251,9 @@
       base::Bind(&AndroidStreamReaderURLRequestJob::OnReaderReadCompleted,
                  weak_factory_.GetWeakPtr()));
 
-  return net::ERR_IO_PENDING;
+  SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING,
+                                  net::ERR_IO_PENDING));
+  return false;
 }
 
 bool AndroidStreamReaderURLRequestJob::GetMimeType(
@@ -289,11 +303,6 @@
 
 void AndroidStreamReaderURLRequestJob::DoStart() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (range_parse_result_ != net::OK) {
-    NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                           range_parse_result_));
-    return;
-  }
   // Start reading asynchronously so that all error reporting and data
   // callbacks happen as they would for network requests.
   SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING,
@@ -374,18 +383,19 @@
     const net::HttpRequestHeaders& headers) {
   std::string range_header;
   if (headers.GetHeader(net::HttpRequestHeaders::kRange, &range_header)) {
-    // This job only cares about the Range header so that we know how many bytes
-    // in the stream to skip and how many to read after that. Note that
-    // validation is deferred to DoStart(), because NotifyStartError() is not
-    // legal to call since the job has not started.
+    // We only extract the "Range" header so that we know how many bytes in the
+    // stream to skip and how many to read after that.
     std::vector<net::HttpByteRange> ranges;
     if (net::HttpUtil::ParseRangeHeader(range_header, &ranges)) {
-      if (ranges.size() == 1)
+      if (ranges.size() == 1) {
         byte_range_ = ranges[0];
-    } else {
-      // We don't support multiple range requests in one single URL request,
-      // because we need to do multipart encoding here.
-      range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
+      } else {
+        // We don't support multiple range requests in one single URL request,
+        // because we need to do multipart encoding here.
+        NotifyDone(
+            net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                  net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+      }
     }
   }
 }
diff --git a/android_webview/browser/net/android_stream_reader_url_request_job.h b/android_webview/browser/net/android_stream_reader_url_request_job.h
index 645be13..e21d7655 100644
--- a/android_webview/browser/net/android_stream_reader_url_request_job.h
+++ b/android_webview/browser/net/android_stream_reader_url_request_job.h
@@ -15,7 +15,6 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
-#include "net/base/net_errors.h"
 #include "net/http/http_byte_range.h"
 #include "net/url_request/url_request_job.h"
 
@@ -97,7 +96,7 @@
   // URLRequestJob:
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
   bool GetMimeType(std::string* mime_type) const override;
   bool GetCharset(std::string* charset) override;
@@ -132,7 +131,6 @@
   void OnReaderReadCompleted(int bytes_read);
 
   net::HttpByteRange byte_range_;
-  net::Error range_parse_result_;
   scoped_ptr<net::HttpResponseInfo> response_info_;
   scoped_ptr<Delegate> delegate_;
   scoped_ptr<DelegateObtainer> delegate_obtainer_;
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
index bdbfccd1..d656d06 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
@@ -133,6 +133,10 @@
       ->AddVisitedURLs(params.redirects);
 }
 
+void AwRenderViewHostExt::OnPageScaleFactorChanged(float page_scale_factor) {
+  client_->OnWebLayoutPageScaleFactorChanged(page_scale_factor);
+}
+
 bool AwRenderViewHostExt::OnMessageReceived(const IPC::Message& message) {
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(AwRenderViewHostExt, message)
@@ -140,8 +144,6 @@
                         OnDocumentHasImagesResponse)
     IPC_MESSAGE_HANDLER(AwViewHostMsg_UpdateHitTestData,
                         OnUpdateHitTestData)
-    IPC_MESSAGE_HANDLER(AwViewHostMsg_PageScaleFactorChanged,
-                        OnPageScaleFactorChanged)
     IPC_MESSAGE_HANDLER(AwViewHostMsg_OnContentsSizeChanged,
                         OnContentsSizeChanged)
     IPC_MESSAGE_UNHANDLED(handled = false)
@@ -170,10 +172,6 @@
   has_new_hit_test_data_ = true;
 }
 
-void AwRenderViewHostExt::OnPageScaleFactorChanged(float page_scale_factor) {
-  client_->OnWebLayoutPageScaleFactorChanged(page_scale_factor);
-}
-
 void AwRenderViewHostExt::OnContentsSizeChanged(
     const gfx::Size& contents_size) {
   client_->OnWebLayoutContentsSizeChanged(contents_size);
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.h b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
index b3fcfbc..25fa61e 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.h
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
@@ -89,11 +89,11 @@
   void DidNavigateAnyFrame(content::RenderFrameHost* render_frame_host,
                            const content::LoadCommittedDetails& details,
                            const content::FrameNavigateParams& params) override;
+  void OnPageScaleFactorChanged(float page_scale_factor) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
   void OnDocumentHasImagesResponse(int msg_id, bool has_images);
   void OnUpdateHitTestData(const AwHitTestData& hit_test_data);
-  void OnPageScaleFactorChanged(float page_scale_factor);
   void OnContentsSizeChanged(const gfx::Size& contents_size);
 
   bool IsRenderViewReady() const;
diff --git a/android_webview/common/render_view_messages.h b/android_webview/common/render_view_messages.h
index 45796f1..4c42f3d0 100644
--- a/android_webview/common/render_view_messages.h
+++ b/android_webview/common/render_view_messages.h
@@ -96,28 +96,10 @@
 IPC_MESSAGE_ROUTED1(AwViewHostMsg_UpdateHitTestData,
                     android_webview::AwHitTestData)
 
-// Sent whenever the page scale factor (as seen by RenderView) is changed.
-IPC_MESSAGE_ROUTED1(AwViewHostMsg_PageScaleFactorChanged,
-                    float /* page_scale_factor */)
-
 // Sent whenever the contents size (as seen by RenderView) is changed.
 IPC_MESSAGE_ROUTED1(AwViewHostMsg_OnContentsSizeChanged,
                     gfx::Size /* contents_size */)
 
-// Sent immediately before a top level navigation is initiated within Blink.
-// There are some exlusions, the most important ones are it is not sent
-// when creating a popup window, and not sent for application initiated
-// navigations. See AwContentRendererClient::HandleNavigation for all
-// cornercases. This is sent before updating the NavigationController state
-// or creating a URLRequest for the main frame resource.
-IPC_SYNC_MESSAGE_CONTROL5_1(AwViewHostMsg_ShouldOverrideUrlLoading,
-                            int /* render_frame_id id */,
-                            base::string16 /* in - url */,
-                            bool /* in - has_user_gesture */,
-                            bool /* in - is_redirect */,
-                            bool /* in - is_main_frame */,
-                            bool /* out - result */)
-
 // Sent when a subframe is created.
 IPC_MESSAGE_CONTROL2(AwViewHostMsg_SubFrameCreated,
                      int /* parent_render_frame_id */,
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 18735e6..75a8dcfc 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -291,10 +291,6 @@
 
     private PostMessageSender mPostMessageSender;
 
-    // This flag indicates that ShouldOverrideUrlNavigation should be posted
-    // through the resourcethrottle. This is only used for popup windows.
-    private boolean mDeferredShouldOverrideUrlLoadingIsPendingForPopup;
-
     // This is a workaround for some qualcomm devices discarding buffer on
     // Activity restore.
     private boolean mInvalidateRootViewOnNextDraw;
@@ -504,23 +500,38 @@
         @Override
         public boolean shouldIgnoreNavigation(NavigationParams navigationParams) {
             final String url = navigationParams.url;
+
+            final int transitionType = navigationParams.pageTransitionType;
+            final boolean isLoadUrl = (transitionType & PageTransition.FROM_API) != 0;
+            final boolean isBackForward = (transitionType & PageTransition.FORWARD_BACK) != 0;
+            final boolean isReload =
+                    (transitionType & PageTransition.CORE_MASK) == PageTransition.RELOAD;
+            final boolean isRedirect = navigationParams.isRedirect;
+
             boolean ignoreNavigation = false;
-            if (mDeferredShouldOverrideUrlLoadingIsPendingForPopup) {
-                mDeferredShouldOverrideUrlLoadingIsPendingForPopup = false;
-                // If this is used for all navigations in future, cases for application initiated
-                // load, redirect and backforward should also be filtered out.
-                if (!navigationParams.isPost) {
-                    ignoreNavigation = mContentsClient.shouldIgnoreNavigation(
-                            mContext, url, navigationParams.isMainFrame,
-                            navigationParams.hasUserGesture
-                            || navigationParams.hasUserGestureCarryover,
-                            navigationParams.isRedirect);
-                }
+            // Any navigation from loadUrl, goBack/Forward, or reload, are considered application
+            // initiated and hence will not yield a shouldOverrideUrlLoading() callback.
+            if ((!isLoadUrl || isRedirect) && !isBackForward && !isReload
+                    && !navigationParams.isPost) {
+                ignoreNavigation = mContentsClient.shouldIgnoreNavigation(mContext, url,
+                        navigationParams.isMainFrame,
+                        navigationParams.hasUserGesture || navigationParams.hasUserGestureCarryover,
+                        navigationParams.isRedirect);
             }
+
             // The shouldOverrideUrlLoading call might have resulted in posting messages to the
             // UI thread. Using sendMessage here (instead of calling onPageStarted directly)
             // will allow those to run in order.
-            if (!ignoreNavigation) {
+            if (isRedirect) {
+                mContentsClient.getCallbackHelper().postOnPageStarted(url);
+                // We can post onPageFinished here since we know that the navigation will fail.
+                // Also AwWebContentsObserver.didFail does not call OnPageFinished when the
+                // navigation is overridden because we don't want an onPageFinished for such a
+                // navigation unless it is a redirect.
+                if (ignoreNavigation) {
+                    mContentsClient.getCallbackHelper().postOnPageFinished(url);
+                }
+            } else if (!ignoreNavigation) {
                 mContentsClient.getCallbackHelper().postOnPageStarted(url);
             }
             return ignoreNavigation;
@@ -1015,7 +1026,6 @@
     // Recap: supplyContentsForPopup() is called on the parent window's content, this method is
     // called on the popup window's content.
     private void receivePopupContents(long popupNativeAwContents) {
-        mDeferredShouldOverrideUrlLoadingIsPendingForPopup = true;
         // Save existing view state.
         final boolean wasAttached = mIsAttachedToWindow;
         final boolean wasViewVisible = mIsViewVisible;
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 5f34edc..c1b03a17 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
@@ -259,13 +259,6 @@
         mClient.handleJsBeforeUnload(url, message, handler);
     }
 
-    @CalledByNative
-    private boolean shouldOverrideUrlLoading(
-            String url, boolean hasUserGesture, boolean isRedirect, boolean isMainFrame) {
-        return mClient.shouldIgnoreNavigation(
-                mContext, url, isMainFrame, hasUserGesture, isRedirect);
-    }
-
     void confirmJsResult(int id, String prompt) {
         if (mNativeContentsClientBridge == 0) return;
         nativeConfirmJsResult(mNativeContentsClientBridge, id, prompt);
diff --git a/android_webview/java/src/org/chromium/android_webview/AwLayoutSizer.java b/android_webview/java/src/org/chromium/android_webview/AwLayoutSizer.java
index e6149e1..8e934e9 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwLayoutSizer.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwLayoutSizer.java
@@ -20,9 +20,8 @@
     private int mContentHeightCss;
     private int mContentWidthCss;
 
-    // Page scale factor. This is set to zero initially so that we don't attempt to do a layout if
-    // we get the content size change notification first and a page scale change second.
-    private float mPageScaleFactor = 0.0f;
+    // Page scale factor.
+    private float mPageScaleFactor = 1.0f;
 
     // Whether to postpone layout requests.
     private boolean mFreezeLayoutRequests;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
index 85cf90c..53715c6 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
@@ -53,9 +53,13 @@
         String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl();
         boolean isErrorUrl =
                 unreachableWebDataUrl != null && unreachableWebDataUrl.equals(failingUrl);
-        if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED) {
+        if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED
+                && !wasIgnoredByHandler) {
             // Need to call onPageFinished for backwards compatibility with the classic webview.
             // See also AwContents.IoThreadClientImpl.onReceivedError.
+            // If the navigation was ignored because of shouldOverrideUrlLoading we have already
+            // called onPageFinished in
+            // AwContents.InterceptNavigationDelegateImpl.shouldIgnoreNavigation instead.
             client.getCallbackHelper().postOnPageFinished(failingUrl);
         }
     }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
index aab4b6e..865d064d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
@@ -152,9 +152,7 @@
         assertZeroHeight(testContainerView);
 
         final int contentSizeChangeCallCount = mOnContentSizeChangedHelper.getCallCount();
-        final int pageScaleChangeCallCount = mOnPageScaleChangedHelper.getCallCount();
         loadUrlAsync(testContainerView.getAwContents(), CommonResources.ABOUT_HTML);
-        mOnPageScaleChangedHelper.waitForCallback(pageScaleChangeCallCount);
         mOnContentSizeChangedHelper.waitForCallback(contentSizeChangeCallCount);
         assertTrue(mOnContentSizeChangedHelper.getHeight() > 0);
     }
@@ -174,9 +172,7 @@
         assertZeroHeight(testContainerView);
 
         final int contentSizeChangeCallCount = mOnContentSizeChangedHelper.getCallCount();
-        final int pageScaleChangeCallCount = mOnPageScaleChangedHelper.getCallCount();
         loadUrlAsync(testContainerView.getAwContents(), CommonResources.ABOUT_HTML);
-        mOnPageScaleChangedHelper.waitForCallback(pageScaleChangeCallCount);
         mOnContentSizeChangedHelper.waitForCallback(contentSizeChangeCallCount);
         assertTrue(mOnContentSizeChangedHelper.getHeight() > 0);
 
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 4329707f..cff939fc 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
@@ -11,6 +11,7 @@
 import org.chromium.android_webview.AwContentsClient;
 import org.chromium.android_webview.test.util.CommonResources;
 import org.chromium.android_webview.test.util.JSUtils;
+import org.chromium.android_webview.test.util.JavascriptEventObserver;
 import org.chromium.base.annotations.SuppressFBWarnings;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
@@ -26,6 +27,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -721,7 +723,9 @@
         assertEquals(redirectTarget,
                 mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingUrl());
         assertEquals(serverSideRedirect, mShouldOverrideUrlLoadingHelper.isRedirect());
-        assertFalse(mShouldOverrideUrlLoadingHelper.hasUserGesture());
+        // We keep the user gesture from the initial navigation for serverside redirects but drop
+        // the user gesture for browser initiated redirects.
+        assertEquals(serverSideRedirect, mShouldOverrideUrlLoadingHelper.hasUserGesture());
         assertTrue(mShouldOverrideUrlLoadingHelper.isMainFrame());
     }
 
@@ -1053,4 +1057,88 @@
     public void testClickableContentInIframe() throws Throwable {
         doTestClickableContent(false);
     }
+
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testXhrInLink() throws Throwable {
+        standardSetup();
+        final CountDownLatch shouldOverrideUrlLoadingSignal = new CountDownLatch(1);
+
+        final String xhrPath = "/xhrPath.html";
+        final String xhrUrl = mWebServer.setResponseWithRunnableAction(
+                xhrPath, CommonResources.makeHtmlPageFrom("", ""), null, new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            shouldOverrideUrlLoadingSignal.await();
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                });
+
+        final String xhrJs = "function xhrFunction() {"
+                + "  var xhr = new XMLHttpRequest();"
+                + "  xhr.onload=function() {"
+                + "     console.info('xhr loaded');"
+                + "     window.jsInterface.setValue(true);"
+                + "  };"
+                + "  xhr.onerror=function() {"
+                + "     console.info('xhr failed, status ' + xhr.status);"
+                + "     window.jsInterface.setValue(false);"
+                + "  };"
+                + "  xhr.open('GET', '" + xhrUrl + "', true);"
+                + "  xhr.send();"
+                + "};";
+
+        String pageWithXhrLink = makeHtmlPageFrom(
+                "<script>" + xhrJs + "</script>", "<img onclick=\"xhrFunction(); location.href='"
+                        + "thiswillbe://intercepted/"
+                        + "'\" class=\"big\" id=\"link\" />");
+
+        final String startPath = "/startPath.html";
+        final String startUrl = addPageToTestServer(startPath, pageWithXhrLink);
+
+        enableJavaScriptOnUiThread(mAwContents);
+        final BooleanValueJavascriptObserver jsInterface = new BooleanValueJavascriptObserver();
+
+        // add javascript interface
+        getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                jsInterface.register(mAwContents.getContentViewCore(), "jsInterface");
+            }
+        });
+
+        loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), startUrl);
+
+        setShouldOverrideUrlLoadingReturnValueOnUiThread(true);
+        final int shouldOverrideUrlLoadingCallCount =
+                mShouldOverrideUrlLoadingHelper.getCallCount();
+
+        assertEquals(0, mWebServer.getRequestCount(xhrPath));
+
+        clickOnLinkUsingJs();
+
+        // Make the server xhr response wait until the navigation request is intercepted.
+        mShouldOverrideUrlLoadingHelper.waitForCallback(shouldOverrideUrlLoadingCallCount);
+        shouldOverrideUrlLoadingSignal.countDown();
+
+        jsInterface.waitForEvent(WAIT_TIMEOUT_MS);
+        assertTrue(jsInterface.getValue());
+        assertEquals(1, mWebServer.getRequestCount(xhrPath));
+    }
+
+    private static class BooleanValueJavascriptObserver extends JavascriptEventObserver {
+        private boolean mValue = false;
+
+        public void setValue(boolean value) {
+            mValue = value;
+            notifyJava();
+        }
+
+        public boolean getValue() {
+            return mValue;
+        }
+    }
 }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java
index 18e06eb..69249ad5e 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwLayoutSizerTest.java
@@ -71,7 +71,6 @@
         final int contentHeight = 389;
 
         layoutSizer.onContentSizeChanged(contentWidth, contentHeight);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
 
@@ -89,7 +88,6 @@
         layoutSizer.setDIPScale(DIP_SCALE);
 
         layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         final int requestLayoutCallCount = delegate.requestLayoutCallCount;
         layoutSizer.onContentSizeChanged(SECOND_CONTENT_WIDTH, SECOND_CONTENT_WIDTH);
 
@@ -105,7 +103,6 @@
         layoutSizer.setDIPScale(DIP_SCALE);
 
         layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
         final int requestLayoutCallCount = delegate.requestLayoutCallCount;
@@ -123,7 +120,6 @@
         layoutSizer.setDIPScale(DIP_SCALE);
 
         layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
         final int requestLayoutCallCount = delegate.requestLayoutCallCount;
@@ -140,7 +136,6 @@
         layoutSizer.setDelegate(delegate);
         layoutSizer.setDIPScale(DIP_SCALE);
 
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
@@ -164,7 +159,6 @@
         layoutSizer.setDelegate(delegate);
         layoutSizer.setDIPScale(DIP_SCALE);
 
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
@@ -190,7 +184,6 @@
         layoutSizer.setDelegate(delegate);
         layoutSizer.setDIPScale(DIP_SCALE);
 
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
@@ -228,7 +221,6 @@
         layoutSizer.setDelegate(delegate);
         layoutSizer.setDIPScale(DIP_SCALE);
 
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.EXACTLY),
@@ -247,7 +239,6 @@
         layoutSizer.setDelegate(delegate);
         layoutSizer.setDIPScale(DIP_SCALE);
 
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
         layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
@@ -268,7 +259,6 @@
         final float tooLargePageScale = 3.00f;
 
         layoutSizer.onContentSizeChanged(SMALLER_CONTENT_SIZE, SMALLER_CONTENT_SIZE);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
@@ -343,7 +333,6 @@
         layoutSizer.setDIPScale(dipScale);
 
         layoutSizer.onContentSizeChanged(FIRST_CONTENT_WIDTH, FIRST_CONTENT_HEIGHT);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY),
                 MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY));
         assertEquals(measuredWidth, delegate.measuredWidth & View.MEASURED_SIZE_MASK);
@@ -364,7 +353,6 @@
 
         layoutSizer.setDIPScale(dipScale);
         layoutSizer.onContentSizeChanged(contentWidth, contentHeight);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
 
@@ -422,7 +410,6 @@
         layoutSizer.setDIPScale(DIP_SCALE);
 
         layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
@@ -446,7 +433,6 @@
         layoutSizer.setDIPScale(DIP_SCALE);
 
         layoutSizer.onContentSizeChanged(TOO_LARGE_CONTENT_SIZE, TOO_LARGE_CONTENT_SIZE);
-        layoutSizer.onPageScaleChanged(INITIAL_PAGE_SCALE);
         layoutSizer.onMeasure(
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST),
                 MeasureSpec.makeMeasureSpec(AT_MOST_MEASURE_SIZE, MeasureSpec.AT_MOST));
diff --git a/android_webview/native/aw_contents_client_bridge.cc b/android_webview/native/aw_contents_client_bridge.cc
index 5c4a1b3..9e570af6 100644
--- a/android_webview/native/aw_contents_client_bridge.cc
+++ b/android_webview/native/aw_contents_client_bridge.cc
@@ -340,21 +340,6 @@
       env, obj.obj(), jurl.obj(), jmessage.obj(), callback_id);
 }
 
-bool AwContentsClientBridge::ShouldOverrideUrlLoading(const base::string16& url,
-                                                      bool has_user_gesture,
-                                                      bool is_redirect,
-                                                      bool is_main_frame) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
-  if (obj.is_null())
-    return false;
-  ScopedJavaLocalRef<jstring> jurl = ConvertUTF16ToJavaString(env, url);
-  devtools_instrumentation::ScopedEmbedderCallbackTask(
-      "shouldOverrideUrlLoading");
-  return Java_AwContentsClientBridge_shouldOverrideUrlLoading(
-      env, obj.obj(), jurl.obj(), has_user_gesture, is_redirect, is_main_frame);
-}
-
 void AwContentsClientBridge::ConfirmJsResult(JNIEnv* env,
                                              jobject,
                                              int id,
diff --git a/android_webview/native/aw_contents_client_bridge.h b/android_webview/native/aw_contents_client_bridge.h
index 6908c92d..74f13e0 100644
--- a/android_webview/native/aw_contents_client_bridge.h
+++ b/android_webview/native/aw_contents_client_bridge.h
@@ -54,10 +54,6 @@
       const base::string16& message_text,
       const content::JavaScriptDialogManager::DialogClosedCallback& callback)
       override;
-  bool ShouldOverrideUrlLoading(const base::string16& url,
-                                bool has_user_gesture,
-                                bool is_redirect,
-                                bool is_main_frame) override;
 
   // Methods called from Java.
   void ProceedSslError(JNIEnv* env, jobject obj, jboolean proceed, jint id);
diff --git a/android_webview/renderer/aw_content_renderer_client.cc b/android_webview/renderer/aw_content_renderer_client.cc
index 7203f90..f25b936 100644
--- a/android_webview/renderer/aw_content_renderer_client.cc
+++ b/android_webview/renderer/aw_content_renderer_client.cc
@@ -29,8 +29,6 @@
 #include "components/printing/renderer/print_web_view_helper.h"
 #include "components/visitedlink/renderer/visitedlink_slave.h"
 #include "content/public/common/url_constants.h"
-#include "content/public/renderer/document_state.h"
-#include "content/public/renderer/navigation_state.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_thread.h"
 #include "content/public/renderer/render_view.h"
@@ -41,7 +39,6 @@
 #include "third_party/WebKit/public/platform/WebURLError.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/web/WebFrame.h"
-#include "third_party/WebKit/public/web/WebNavigationType.h"
 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -79,61 +76,6 @@
   blink::WebSecurityPolicy::registerURLSchemeAsSecure(aw_scheme);
 }
 
-bool AwContentRendererClient::HandleNavigation(
-    content::RenderFrame* render_frame,
-    bool is_content_initiated,
-    int opener_id,
-    blink::WebFrame* frame,
-    const blink::WebURLRequest& request,
-    blink::WebNavigationType type,
-    blink::WebNavigationPolicy default_policy,
-    bool is_redirect) {
-  // Only GETs can be overridden.
-  if (!request.httpMethod().equals("GET"))
-    return false;
-
-  // Any navigation from loadUrl, and goBack/Forward are considered application-
-  // initiated and hence will not yield a shouldOverrideUrlLoading() callback.
-  // Webview classic does not consider reload application-initiated so we
-  // continue the same behavior.
-  // TODO(sgurun) is_content_initiated is normally false for cross-origin
-  // navigations but since android_webview does not swap out renderers, this
-  // works fine. This will stop working if android_webview starts swapping out
-  // renderers on navigation.
-  bool application_initiated =
-      !is_content_initiated || type == blink::WebNavigationTypeBackForward;
-
-  // Don't offer application-initiated navigations unless it's a redirect.
-  if (application_initiated && !is_redirect)
-    return false;
-
-  bool is_main_frame = !frame->parent();
-  const GURL& gurl = request.url();
-  // For HTTP schemes, only top-level navigations can be overridden. Similarly,
-  // WebView Classic lets app override only top level about:blank navigations.
-  // So we filter out non-top about:blank navigations here.
-  if (!is_main_frame &&
-      (gurl.SchemeIs(url::kHttpScheme) || gurl.SchemeIs(url::kHttpsScheme) ||
-       gurl.SchemeIs(url::kAboutScheme)))
-    return false;
-
-  // use NavigationInterception throttle to handle the call as that can
-  // be deferred until after the java side has been constructed.
-  if (opener_id != MSG_ROUTING_NONE) {
-    return false;
-  }
-
-  bool ignore_navigation = false;
-  base::string16 url = request.url().string();
-  bool has_user_gesture = request.hasUserGesture();
-
-  int render_frame_id = render_frame->GetRoutingID();
-  RenderThread::Get()->Send(new AwViewHostMsg_ShouldOverrideUrlLoading(
-      render_frame_id, url, has_user_gesture, is_redirect, is_main_frame,
-      &ignore_navigation));
-  return ignore_navigation;
-}
-
 void AwContentRendererClient::RenderFrameCreated(
     content::RenderFrame* render_frame) {
   new AwContentSettingsClient(render_frame);
diff --git a/android_webview/renderer/aw_content_renderer_client.h b/android_webview/renderer/aw_content_renderer_client.h
index 499c63c..ecdf593 100644
--- a/android_webview/renderer/aw_content_renderer_client.h
+++ b/android_webview/renderer/aw_content_renderer_client.h
@@ -36,14 +36,6 @@
   bool IsLinkVisited(unsigned long long link_hash) override;
   void AddKeySystems(std::vector<media::KeySystemInfo>* key_systems) override;
 
-  bool HandleNavigation(content::RenderFrame* render_frame,
-                        bool is_content_initiated,
-                        int opener_id,
-                        blink::WebFrame* frame,
-                        const blink::WebURLRequest& request,
-                        blink::WebNavigationType type,
-                        blink::WebNavigationPolicy default_policy,
-                        bool is_redirect) override;
   bool ShouldOverridePageVisibilityState(
       const content::RenderFrame* render_frame,
       blink::WebPageVisibilityState* override_state) override;
diff --git a/android_webview/renderer/aw_render_view_ext.cc b/android_webview/renderer/aw_render_view_ext.cc
index 6a6164e..35cd1905 100644
--- a/android_webview/renderer/aw_render_view_ext.cc
+++ b/android_webview/renderer/aw_render_view_ext.cc
@@ -146,7 +146,7 @@
 }  // namespace
 
 AwRenderViewExt::AwRenderViewExt(content::RenderView* render_view)
-    : content::RenderViewObserver(render_view), page_scale_factor_(0.0f) {
+    : content::RenderViewObserver(render_view) {
 }
 
 AwRenderViewExt::~AwRenderViewExt() {
@@ -188,33 +188,27 @@
 }
 
 void AwRenderViewExt::DidCommitCompositorFrame() {
-  PostCheckContentsSizeAndScale();
+  PostCheckContentsSize();
 }
 
 void AwRenderViewExt::DidUpdateLayout() {
-  PostCheckContentsSizeAndScale();
+  PostCheckContentsSize();
 }
 
-void AwRenderViewExt::PostCheckContentsSizeAndScale() {
+void AwRenderViewExt::PostCheckContentsSize() {
   if (check_contents_size_timer_.IsRunning())
     return;
 
   check_contents_size_timer_.Start(FROM_HERE,
                                    base::TimeDelta::FromMilliseconds(0), this,
-                                   &AwRenderViewExt::CheckContentsSizeAndScale);
+                                   &AwRenderViewExt::CheckContentsSize);
 }
 
-void AwRenderViewExt::CheckContentsSizeAndScale() {
+void AwRenderViewExt::CheckContentsSize() {
   blink::WebView* webview = render_view()->GetWebView();
   if (!webview)
     return;
 
-  if (page_scale_factor_ != webview->pageScaleFactor()) {
-    page_scale_factor_ = webview->pageScaleFactor();
-    Send(new AwViewHostMsg_PageScaleFactorChanged(routing_id(),
-                                                  page_scale_factor_));
-  }
-
   gfx::Size contents_size;
 
   blink::WebFrame* main_frame = webview->mainFrame();
diff --git a/android_webview/renderer/aw_render_view_ext.h b/android_webview/renderer/aw_render_view_ext.h
index 1a032b306..701350a 100644
--- a/android_webview/renderer/aw_render_view_ext.h
+++ b/android_webview/renderer/aw_render_view_ext.h
@@ -56,14 +56,12 @@
 
   void OnSmoothScroll(int target_x, int target_y, long duration_ms);
 
-  void CheckContentsSizeAndScale();
+  void CheckContentsSize();
 
-  void PostCheckContentsSizeAndScale();
+  void PostCheckContentsSize();
 
   bool capture_picture_enabled_;
 
-  float page_scale_factor_;
-
   gfx::Size last_sent_contents_size_;
   base::OneShotTimer check_contents_size_timer_;
 
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index b18d0a01..19d53e1 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -56,6 +56,7 @@
 #include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
+#include "base/strings/utf_string_conversions.h"
 #include "ui/aura/env.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/accelerator_manager.h"
@@ -115,9 +116,48 @@
   return accelerator;
 }
 
+// Ensures that there are no word breaks at the "+"s in the shortcut texts such
+// as "Ctrl+Shift+Space".
+void EnsureNoWordBreaks(base::string16* shortcut_text) {
+  std::vector<base::string16> keys =
+      base::SplitString(*shortcut_text, base::ASCIIToUTF16("+"),
+                        base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+
+  if (keys.size() < 2U)
+    return;
+
+  // The plus sign surrounded by the word joiner to guarantee an non-breaking
+  // shortcut.
+  const base::string16 non_breaking_plus =
+      base::UTF8ToUTF16("\xe2\x81\xa0+\xe2\x81\xa0");
+  shortcut_text->clear();
+  for (size_t i = 0; i < keys.size() - 1; ++i) {
+    *shortcut_text += keys[i];
+    *shortcut_text += non_breaking_plus;
+  }
+
+  *shortcut_text += keys[keys.size() - 1];
+}
+
+// Gets the notification message after it formats it in such a way that there
+// are no line breaks in the middle of the shortcut texts.
+base::string16 GetNotificationText(int message_id,
+                                   int old_shortcut_id,
+                                   int new_shortcut_id) {
+  base::string16 old_shortcut = l10n_util::GetStringUTF16(old_shortcut_id);
+  base::string16 new_shortcut = l10n_util::GetStringUTF16(new_shortcut_id);
+  EnsureNoWordBreaks(&old_shortcut);
+  EnsureNoWordBreaks(&new_shortcut);
+
+  return l10n_util::GetStringFUTF16(message_id, new_shortcut, old_shortcut);
+}
+
 void ShowDeprecatedAcceleratorNotification(const char* const notification_id,
-                                           int message_id) {
-  const base::string16 message = l10n_util::GetStringUTF16(message_id);
+                                           int message_id,
+                                           int old_shortcut_id,
+                                           int new_shortcut_id) {
+  const base::string16 message =
+      GetNotificationText(message_id, old_shortcut_id, new_shortcut_id);
   scoped_ptr<message_center::Notification> notification(
       new message_center::Notification(
           message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
@@ -253,33 +293,38 @@
 }
 
 bool CanHandleNextIme(ImeControlDelegate* ime_control_delegate,
-                      const ui::Accelerator& previous_accelerator) {
-  // We only allow next IME to be triggered if the previous is accelerator key
-  // is ONLY either Shift, Alt, Enter or Space.
-  // The first two cases to avoid conflicting accelerators that contain
-  // Alt+Shift (like Alt+Shift+Tab or Alt+Shift+S) to trigger next IME when the
-  // wrong order of key sequences is pressed. crbug.com/527154.
-  // The latter two cases are needed for CJK IME users who tend to press Enter
-  // (or Space) and Shift+Alt almost at the same time to commit an IME string
-  // and then switch from the IME to the English layout. This allows these users
-  // to trigger NEXT_IME even if they press Shift+Alt before releasing Enter.
-  // crbug.com/139556.
-  // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way.
-  const ui::KeyboardCode previous_key_code = previous_accelerator.key_code();
-  switch (previous_key_code) {
-    case ui::VKEY_SHIFT:
-    case ui::VKEY_LSHIFT:
-    case ui::VKEY_RSHIFT:
-    case ui::VKEY_MENU:
-    case ui::VKEY_LMENU:
-    case ui::VKEY_RMENU:
-    case ui::VKEY_RETURN:
-    case ui::VKEY_SPACE:
-      return ime_control_delegate && ime_control_delegate->CanCycleIme();
+                      const ui::Accelerator& previous_accelerator,
+                      bool current_accelerator_is_deprecated) {
+  if (current_accelerator_is_deprecated) {
+    // We only allow next IME to be triggered if the previous is accelerator key
+    // is ONLY either Shift, Alt, Enter or Space.
+    // The first six cases below are to avoid conflicting accelerators that
+    // contain Alt+Shift (like Alt+Shift+Tab or Alt+Shift+S) to trigger next IME
+    // when the wrong order of key sequences is pressed. crbug.com/527154.
+    // The latter two cases are needed for CJK IME users who tend to press Enter
+    // (or Space) and Shift+Alt almost at the same time to commit an IME string
+    // and then switch from the IME to the English layout. This allows these
+    // users to trigger NEXT_IME even if they press Shift+Alt before releasing
+    // Enter. crbug.com/139556.
+    // TODO(nona|mazda): Fix crbug.com/139556 in a cleaner way.
+    const ui::KeyboardCode previous_key_code = previous_accelerator.key_code();
+    switch (previous_key_code) {
+      case ui::VKEY_SHIFT:
+      case ui::VKEY_LSHIFT:
+      case ui::VKEY_RSHIFT:
+      case ui::VKEY_MENU:
+      case ui::VKEY_LMENU:
+      case ui::VKEY_RMENU:
+      case ui::VKEY_RETURN:
+      case ui::VKEY_SPACE:
+        break;
 
-    default:
-      return false;
+      default:
+        return false;
+    }
   }
+
+  return ime_control_delegate && ime_control_delegate->CanCycleIme();
 }
 
 void HandleNextIme(ImeControlDelegate* ime_control_delegate) {
@@ -832,8 +877,9 @@
         RecordUmaHistogram(data->uma_histogram_name, DEPRECATED_USED);
 
         // We always display the notification as long as this entry exists.
-        ShowDeprecatedAcceleratorNotification(data->uma_histogram_name,
-                                              data->notification_message_id);
+        ShowDeprecatedAcceleratorNotification(
+            data->uma_histogram_name, data->notification_message_id,
+            data->old_shortcut_id, data->new_shortcut_id);
 
         if (!data->deprecated_enabled)
           return false;
@@ -913,17 +959,19 @@
 
 void AcceleratorController::RegisterDeprecatedAccelerators() {
 #if defined(OS_CHROMEOS)
+  for (size_t i = 0; i < kDeprecatedAcceleratorsDataLength; ++i) {
+    const DeprecatedAcceleratorData* data = &kDeprecatedAcceleratorsData[i];
+    actions_with_deprecations_[data->action] = data;
+  }
+
   for (size_t i = 0; i < kDeprecatedAcceleratorsLength; ++i) {
-    const DeprecatedAcceleratorData* data = &kDeprecatedAccelerators[i];
-    const AcceleratorAction action = data->deprecated_accelerator.action;
+    const AcceleratorData& accelerator_data = kDeprecatedAccelerators[i];
     const ui::Accelerator deprecated_accelerator =
-        CreateAccelerator(data->deprecated_accelerator.keycode,
-                          data->deprecated_accelerator.modifiers,
-                          data->deprecated_accelerator.trigger_on_press);
+        CreateAccelerator(accelerator_data.keycode, accelerator_data.modifiers,
+                          accelerator_data.trigger_on_press);
 
     Register(deprecated_accelerator, this);
-    actions_with_deprecations_[action] = data;
-    accelerators_[deprecated_accelerator] = action;
+    accelerators_[deprecated_accelerator] = accelerator_data.action;
     deprecated_accelerators_.insert(deprecated_accelerator);
   }
 #endif  // defined(OS_CHROMEOS)
@@ -964,9 +1012,18 @@
       return CanHandleMagnifyScreen();
     case NEW_INCOGNITO_WINDOW:
       return CanHandleNewIncognitoWindow();
-    case NEXT_IME:
-      return CanHandleNextIme(ime_control_delegate_.get(),
-                              previous_accelerator);
+    case NEXT_IME: {
+#if defined(OS_CHROMEOS)
+      bool accelerator_is_deprecated =
+          (deprecated_accelerators_.count(accelerator) != 0);
+#else
+      // On non-chromeos, the NEXT_IME deprecated accelerators are always used.
+      bool accelerator_is_deprecated = true;
+#endif  // defined(OS_CHROMEOS)
+
+      return CanHandleNextIme(ime_control_delegate_.get(), previous_accelerator,
+                              accelerator_is_deprecated);
+    }
     case PREVIOUS_IME:
       return CanHandlePreviousIme(ime_control_delegate_.get());
     case SCALE_UI_RESET:
@@ -986,6 +1043,8 @@
       return CanHandlePositionCenter();
 #if defined(OS_CHROMEOS)
     case DEBUG_ADD_REMOVE_DISPLAY:
+    case DEBUG_TOGGLE_TOUCH_PAD:
+    case DEBUG_TOGGLE_TOUCH_SCREEN:
     case DEBUG_TOGGLE_UNIFIED_DESKTOP:
       return debug::DebugAcceleratorsEnabled();
     case DISABLE_CAPS_LOCK:
@@ -1242,8 +1301,8 @@
       HandleBrightnessUp(brightness_control_delegate_.get(), accelerator);
       break;
     case DEBUG_ADD_REMOVE_DISPLAY:
-      debug::PerformDebugActionIfEnabled(action);
-      break;
+    case DEBUG_TOGGLE_TOUCH_PAD:
+    case DEBUG_TOGGLE_TOUCH_SCREEN:
     case DEBUG_TOGGLE_UNIFIED_DESKTOP:
       debug::PerformDebugActionIfEnabled(action);
       break;
diff --git a/ash/accelerators/accelerator_controller.h b/ash/accelerators/accelerator_controller.h
index 29c4760..79cc673 100644
--- a/ash/accelerators/accelerator_controller.h
+++ b/ash/accelerators/accelerator_controller.h
@@ -133,6 +133,8 @@
   FRIEND_TEST_ALL_PREFIXES(AcceleratorControllerTest, GlobalAccelerators);
   FRIEND_TEST_ALL_PREFIXES(AcceleratorControllerTest,
                            DontRepeatToggleFullscreen);
+  FRIEND_TEST_ALL_PREFIXES(DeprecatedAcceleratorTester,
+                           TestDeprecatedAcceleratorsBehavior);
 
   // Initializes the accelerators this class handles as a target.
   void Init();
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index 366c68b5..2d4b60d 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -230,6 +230,15 @@
   static AcceleratorController* GetController();
 
   static bool ProcessInController(const ui::Accelerator& accelerator) {
+    if (accelerator.type() == ui::ET_KEY_RELEASED) {
+      // If the |accelerator| should trigger on release, then we store the
+      // pressed version of it first in history then the released one to
+      // simulate what happens in reality.
+      ui::Accelerator pressed_accelerator = accelerator;
+      pressed_accelerator.set_type(ui::ET_KEY_PRESSED);
+      GetController()->accelerator_history()->StoreCurrentAccelerator(
+          pressed_accelerator);
+    }
     GetController()->accelerator_history()->
         StoreCurrentAccelerator(accelerator);
     return GetController()->Process(accelerator);
@@ -1095,8 +1104,8 @@
     EXPECT_FALSE(ProcessInController(shift_alt_press));
     EXPECT_FALSE(ProcessInController(shift_alt_x_press));
     EXPECT_FALSE(ProcessInController(shift_alt_x));
-    EXPECT_FALSE(ProcessInController(shift_alt));
-    EXPECT_EQ(2, delegate->handle_next_ime_count());
+    EXPECT_TRUE(ProcessInController(shift_alt));
+    EXPECT_EQ(3, delegate->handle_next_ime_count());
 
     // But we _should_ if X is either VKEY_RETURN or VKEY_SPACE.
     // TODO(nona|mazda): Remove this when crbug.com/139556 in a better way.
@@ -1111,7 +1120,7 @@
     EXPECT_FALSE(ProcessInController(shift_alt_return_press));
     EXPECT_FALSE(ProcessInController(shift_alt_return));
     EXPECT_TRUE(ProcessInController(shift_alt));
-    EXPECT_EQ(3, delegate->handle_next_ime_count());
+    EXPECT_EQ(4, delegate->handle_next_ime_count());
 
     const ui::Accelerator shift_alt_space_press(
         ui::VKEY_SPACE,
@@ -1124,7 +1133,7 @@
     EXPECT_FALSE(ProcessInController(shift_alt_space_press));
     EXPECT_FALSE(ProcessInController(shift_alt_space));
     EXPECT_TRUE(ProcessInController(shift_alt));
-    EXPECT_EQ(4, delegate->handle_next_ime_count());
+    EXPECT_EQ(5, delegate->handle_next_ime_count());
   }
 
 #if defined(OS_CHROMEOS)
@@ -1157,8 +1166,8 @@
     EXPECT_FALSE(ProcessInController(shift_alt_press));
     EXPECT_FALSE(ProcessInController(shift_alt_x_press));
     EXPECT_FALSE(ProcessInController(shift_alt_x));
-    EXPECT_FALSE(ProcessInController(shift_alt));
-    EXPECT_EQ(2, delegate->handle_next_ime_count());
+    EXPECT_TRUE(ProcessInController(shift_alt));
+    EXPECT_EQ(3, delegate->handle_next_ime_count());
   }
 #endif
 }
@@ -1480,6 +1489,15 @@
   DeprecatedAcceleratorTester() {}
   ~DeprecatedAcceleratorTester() override {}
 
+  void SetUp() override {
+    AcceleratorControllerTest::SetUp();
+
+    // For testing the deprecated and new IME shortcuts.
+    DummyImeControlDelegate* delegate = new DummyImeControlDelegate;
+    GetController()->SetImeControlDelegate(
+        scoped_ptr<ImeControlDelegate>(delegate).Pass());
+  }
+
   ui::Accelerator CreateAccelerator(const AcceleratorData& data) const {
     ui::Accelerator result(data.keycode, data.modifiers);
     result.set_type(data.trigger_on_press ? ui::ET_KEY_PRESSED
@@ -1519,20 +1537,22 @@
 
 TEST_F(DeprecatedAcceleratorTester, TestDeprecatedAcceleratorsBehavior) {
   for (size_t i = 0; i < kDeprecatedAcceleratorsLength; ++i) {
-    const DeprecatedAcceleratorData& data = kDeprecatedAccelerators[i];
+    const AcceleratorData& entry = kDeprecatedAccelerators[i];
+
+    auto itr = GetController()->actions_with_deprecations_.find(entry.action);
+    ASSERT_TRUE(itr != GetController()->actions_with_deprecations_.end());
+    const DeprecatedAcceleratorData* data = itr->second;
 
     EXPECT_TRUE(IsMessageCenterEmpty());
-
-    ui::Accelerator deprecated_accelerator =
-        CreateAccelerator(data.deprecated_accelerator);
-    if (data.deprecated_enabled)
+    ui::Accelerator deprecated_accelerator = CreateAccelerator(entry);
+    if (data->deprecated_enabled)
       EXPECT_TRUE(ProcessInController(deprecated_accelerator));
     else
       EXPECT_FALSE(ProcessInController(deprecated_accelerator));
 
     // We expect to see a notification in the message center.
     EXPECT_TRUE(
-        ContainsDeprecatedAcceleratorNotification(data.uma_histogram_name));
+        ContainsDeprecatedAcceleratorNotification(data->uma_histogram_name));
     RemoveAllNotifications();
 
     // If the action is LOCK_SCREEN, we must reset the state by unlocking the
@@ -1545,6 +1565,7 @@
   // Add below the new accelerators that replaced the deprecated ones (if any).
   const AcceleratorData kNewAccelerators[] = {
       {true, ui::VKEY_L, ui::EF_COMMAND_DOWN, LOCK_SCREEN},
+      {true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, NEXT_IME},
       {true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN, SHOW_TASK_MANAGER},
   };
 
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc
index 35888ed..e9dac97 100644
--- a/ash/accelerators/accelerator_table.cc
+++ b/ash/accelerators/accelerator_table.cc
@@ -10,16 +10,6 @@
 namespace ash {
 
 const AcceleratorData kAcceleratorData[] = {
-  // We have to define 3 entries for Shift+Alt. VKEY_[LR]MENU might be sent to
-  // the accelerator controller when RenderWidgetHostViewAura is focused, and
-  // VKEY_MENU might be when it's not (e.g. when NativeWidgetAura is focused).
-  { false, ui::VKEY_LMENU, ui::EF_SHIFT_DOWN, NEXT_IME },
-  { false, ui::VKEY_MENU, ui::EF_SHIFT_DOWN, NEXT_IME },
-  { false, ui::VKEY_RMENU, ui::EF_SHIFT_DOWN, NEXT_IME },
-  // The same is true for Alt+Shift.
-  { false, ui::VKEY_LSHIFT, ui::EF_ALT_DOWN, NEXT_IME },
-  { false, ui::VKEY_SHIFT, ui::EF_ALT_DOWN, NEXT_IME },
-  { false, ui::VKEY_RSHIFT, ui::EF_ALT_DOWN, NEXT_IME },
   { true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, PREVIOUS_IME },
   { false, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, PREVIOUS_IME },
   // Shortcuts for Japanese IME.
@@ -102,11 +92,24 @@
   { true, ui::VKEY_VOLUME_DOWN, ui::EF_NONE, VOLUME_DOWN },
   { true, ui::VKEY_VOLUME_UP, ui::EF_NONE, VOLUME_UP },
   { true, ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN, SHOW_TASK_MANAGER },
+  { true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, NEXT_IME },
 #else
   // This key has been deprecated on CrOS. It is instead included below in the
   // |kDeprecatedAccelerators|, and above in the CrOS accelerators as
   // Search+Esc.
   { true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN, SHOW_TASK_MANAGER },
+  // The below keys have been deprecated on ChromeOS and were replaced above by
+  // Ctrl+Shift+Space. crbug.com/535004.
+  // We have to define 3 entries for Shift+Alt. VKEY_[LR]MENU might be sent to
+  // the accelerator controller when RenderWidgetHostViewAura is focused, and
+  // VKEY_MENU might be when it's not (e.g. when NativeWidgetAura is focused).
+  { false, ui::VKEY_LMENU, ui::EF_SHIFT_DOWN, NEXT_IME },
+  { false, ui::VKEY_MENU, ui::EF_SHIFT_DOWN, NEXT_IME },
+  { false, ui::VKEY_RMENU, ui::EF_SHIFT_DOWN, NEXT_IME },
+  // The same is true for Alt+Shift.
+  { false, ui::VKEY_LSHIFT, ui::EF_ALT_DOWN, NEXT_IME },
+  { false, ui::VKEY_SHIFT, ui::EF_ALT_DOWN, NEXT_IME },
+  { false, ui::VKEY_RSHIFT, ui::EF_ALT_DOWN, NEXT_IME },
 #endif  // defined(OS_CHROMEOS)
   { true, ui::VKEY_I, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, OPEN_FEEDBACK_PAGE },
 #if !defined(OS_WIN)
@@ -188,8 +191,9 @@
 // 1- Replace the old deprecated accelerator from the above list with the new
 //    accelerator that will take its place.
 // 2- Add an entry for it in the following |kDeprecatedAccelerators| list.
-// 3- That entry should contain the following:
-//    - The deprecated accelerator data you removed from above.
+// 3- Add another entry in the |kDeprecatedAcceleratorsData|.
+// 4- That entry should contain the following:
+//    - The action that the deprecated accelerator maps to.
 //    - Define a histogram for this action in |histograms.xml| in the form
 //      "Ash.Accelerators.Deprecated.{ActionName}" and include the name of this
 //      histogram in this entry. This name will be used as the ID of the
@@ -198,28 +202,57 @@
 //    - The ID of the localized notification message to give the users telling
 //      them about the deprecation (Add one in |ash_chromeos_strings.grdp|.
 //      Search for the comment <!-- Deprecated Accelerators Messages -->).
+//    - The IDs of the localized old and new shortcut text to be used to fill
+//      the notification text. Also found in |ash_chromeos_strings.grdp|.
 //    - {true or false} whether the deprecated accelerator is still enabled (we
 //      don't disable a deprecated accelerator abruptly).
-// 4- Don't forget to update the keyboard overlay.
+// 5- Don't forget to update the keyboard overlay. Find 'shortcut' in the file
+//    keyboard_overlay_data.js.
 #if defined(OS_CHROMEOS)
 
-const DeprecatedAcceleratorData kDeprecatedAccelerators[] = {
-  {
-    { true, ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, LOCK_SCREEN },
-    "Ash.Accelerators.Deprecated.LockScreen",
-    IDS_DEPRECATED_LOCK_SCREEN_MSG,
-    true
-  },
-  {
-    { true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN, SHOW_TASK_MANAGER },
-    "Ash.Accelerators.Deprecated.ShowTaskManager",
-    IDS_DEPRECATED_SHOW_TASK_MANAGER_MSG,
-    true
-  },
+const AcceleratorData kDeprecatedAccelerators[] = {
+  { true, ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, LOCK_SCREEN },
+  { true, ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN, SHOW_TASK_MANAGER },
+  { false, ui::VKEY_LMENU, ui::EF_SHIFT_DOWN, NEXT_IME },
+  { false, ui::VKEY_MENU, ui::EF_SHIFT_DOWN, NEXT_IME },
+  { false, ui::VKEY_RMENU, ui::EF_SHIFT_DOWN, NEXT_IME },
+  { false, ui::VKEY_LSHIFT, ui::EF_ALT_DOWN, NEXT_IME },
+  { false, ui::VKEY_SHIFT, ui::EF_ALT_DOWN, NEXT_IME },
+  { false, ui::VKEY_RSHIFT, ui::EF_ALT_DOWN, NEXT_IME },
 };
 
 const size_t kDeprecatedAcceleratorsLength = arraysize(kDeprecatedAccelerators);
 
+const DeprecatedAcceleratorData kDeprecatedAcceleratorsData[] = {
+  {
+    LOCK_SCREEN,
+    "Ash.Accelerators.Deprecated.LockScreen",
+    IDS_DEPRECATED_LOCK_SCREEN_MSG,
+    IDS_SHORTCUT_LOCK_SCREEN_OLD,
+    IDS_SHORTCUT_LOCK_SCREEN_NEW,
+    true
+  },
+  {
+    SHOW_TASK_MANAGER,
+    "Ash.Accelerators.Deprecated.ShowTaskManager",
+    IDS_DEPRECATED_SHOW_TASK_MANAGER_MSG,
+    IDS_SHORTCUT_TASK_MANAGER_OLD,
+    IDS_SHORTCUT_TASK_MANAGER_NEW,
+    true
+  },
+  {
+    NEXT_IME,
+    "Ash.Accelerators.Deprecated.NextIME",
+    IDS_DEPRECATED_NEXT_IME_MSG,
+    IDS_SHORTCUT_NEXT_IME_OLD,
+    IDS_SHORTCUT_NEXT_IME_NEW,
+    true
+  }
+};
+
+const size_t kDeprecatedAcceleratorsDataLength =
+    arraysize(kDeprecatedAcceleratorsData);
+
 #endif  // defined(OS_CHROMEOS)
 
 const AcceleratorData kDebugAcceleratorData[] = {
@@ -238,6 +271,10 @@
      DEBUG_TOGGLE_UNIFIED_DESKTOP},
     {true, ui::VKEY_M, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
      TOGGLE_MIRROR_MODE},
+    {true, ui::VKEY_P, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
+     DEBUG_TOGGLE_TOUCH_PAD},
+    {true, ui::VKEY_T, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
+     DEBUG_TOGGLE_TOUCH_SCREEN},
     {true, ui::VKEY_W, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, TOGGLE_WIFI},
     // Extra shortcut for display swapping as alt-f4 is taken on linux desktop.
     {true, ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
@@ -320,6 +357,8 @@
   BRIGHTNESS_DOWN,
   BRIGHTNESS_UP,
   DEBUG_ADD_REMOVE_DISPLAY,
+  DEBUG_TOGGLE_TOUCH_PAD,
+  DEBUG_TOGGLE_TOUCH_SCREEN,
   DISABLE_CAPS_LOCK,
   DISABLE_GPU_WATCHDOG,
   KEYBOARD_BRIGHTNESS_DOWN,
@@ -373,6 +412,8 @@
   BRIGHTNESS_DOWN,
   BRIGHTNESS_UP,
   DEBUG_ADD_REMOVE_DISPLAY,
+  DEBUG_TOGGLE_TOUCH_PAD,
+  DEBUG_TOGGLE_TOUCH_SCREEN,
   DISABLE_CAPS_LOCK,
   KEYBOARD_BRIGHTNESS_DOWN,
   KEYBOARD_BRIGHTNESS_UP,
@@ -411,6 +452,8 @@
     TOGGLE_MAXIMIZED,
     WINDOW_MINIMIZE,
 #if defined(OS_CHROMEOS)
+    DEBUG_TOGGLE_TOUCH_PAD,
+    DEBUG_TOGGLE_TOUCH_SCREEN,
     LOCK_SCREEN,
 #endif
 };
@@ -439,6 +482,8 @@
   BRIGHTNESS_DOWN,
   BRIGHTNESS_UP,
   DEBUG_ADD_REMOVE_DISPLAY,
+  DEBUG_TOGGLE_TOUCH_PAD,
+  DEBUG_TOGGLE_TOUCH_SCREEN,
   DISABLE_CAPS_LOCK,
   DISABLE_GPU_WATCHDOG,
   KEYBOARD_BRIGHTNESS_DOWN,
@@ -488,6 +533,8 @@
 #if defined(OS_CHROMEOS)
     BRIGHTNESS_DOWN,
     BRIGHTNESS_UP,
+    DEBUG_TOGGLE_TOUCH_PAD,
+    DEBUG_TOGGLE_TOUCH_SCREEN,
     DISABLE_CAPS_LOCK,
     KEYBOARD_BRIGHTNESS_DOWN,
     KEYBOARD_BRIGHTNESS_UP,
diff --git a/ash/accelerators/accelerator_table.h b/ash/accelerators/accelerator_table.h
index 658cad5..3619ccd31 100644
--- a/ash/accelerators/accelerator_table.h
+++ b/ash/accelerators/accelerator_table.h
@@ -112,6 +112,8 @@
   BRIGHTNESS_DOWN,
   BRIGHTNESS_UP,
   DEBUG_ADD_REMOVE_DISPLAY,
+  DEBUG_TOGGLE_TOUCH_PAD,
+  DEBUG_TOGGLE_TOUCH_SCREEN,
   DEBUG_TOGGLE_UNIFIED_DESKTOP,
   DISABLE_CAPS_LOCK,
   DISABLE_GPU_WATCHDOG,
@@ -154,8 +156,8 @@
 
 // Gathers the needed data to handle deprecated accelerators.
 struct DeprecatedAcceleratorData {
-  // The old deprecated accelerator.
-  AcceleratorData deprecated_accelerator;
+  // The action that has deprecated accelerators.
+  AcceleratorAction action;
 
   // The name of the UMA histogram that will be used to measure the deprecated
   // v.s. new accelerator usage.
@@ -165,6 +167,12 @@
   // them about the deprecation.
   int notification_message_id;
 
+  // The ID of the localized old deprecated shortcut key.
+  int old_shortcut_id;
+
+  // The ID of the localized new shortcut key.
+  int new_shortcut_id;
+
   // Specifies whether the deprecated accelerator is still enabled to do its
   // associated action.
   bool deprecated_enabled;
@@ -183,10 +191,14 @@
 ASH_EXPORT extern const size_t kAcceleratorDataLength;
 
 #if defined(OS_CHROMEOS)
-// The list of the deprecated accelerators along with their new replacing ones
-// and how to handle them.
-ASH_EXPORT extern const DeprecatedAcceleratorData kDeprecatedAccelerators[];
+// The list of the deprecated accelerators.
+ASH_EXPORT extern const AcceleratorData kDeprecatedAccelerators[];
 ASH_EXPORT extern const size_t kDeprecatedAcceleratorsLength;
+
+// The list of the actions with deprecated accelerators and the needed data to
+// handle them.
+ASH_EXPORT extern const DeprecatedAcceleratorData kDeprecatedAcceleratorsData[];
+ASH_EXPORT extern const size_t kDeprecatedAcceleratorsDataLength;
 #endif  // defined(OS_CHROMEOS)
 
 // Debug accelerators. Debug accelerators are only enabled when the "Debugging
diff --git a/ash/accelerators/accelerator_table_unittest.cc b/ash/accelerators/accelerator_table_unittest.cc
index 6c86882..c8878fd 100644
--- a/ash/accelerators/accelerator_table_unittest.cc
+++ b/ash/accelerators/accelerator_table_unittest.cc
@@ -4,8 +4,9 @@
 
 #include <set>
 
-#include "base/basictypes.h"
 #include "ash/accelerators/accelerator_table.h"
+#include "base/basictypes.h"
+#include "base/strings/string_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace ash {
@@ -79,18 +80,29 @@
 #if defined(OS_CHROMEOS)
 
 TEST(AcceleratorTableTest, CheckDeprecatedAccelerators) {
-  std::set<AcceleratorAction> deprecated_actions;
+  std::set<AcceleratorData, Cmp> deprecated_actions;
   for (size_t i = 0; i < kDeprecatedAcceleratorsLength; ++i) {
     // A deprecated action can never appear twice in the list.
-    AcceleratorAction deprecated_action =
-        kDeprecatedAccelerators[i].deprecated_accelerator.action;
-    EXPECT_TRUE(deprecated_actions.insert(deprecated_action).second)
-        << "Duplicated action: " << deprecated_action << " at index: " << i;
+    const AcceleratorData& entry = kDeprecatedAccelerators[i];
+    EXPECT_TRUE(deprecated_actions.insert(entry).second)
+        << "Duplicate deprecated accelerator: " << entry.trigger_on_press
+        << ", " << entry.keycode << ", "
+        << (entry.modifiers & ui::EF_SHIFT_DOWN) << ", "
+        << (entry.modifiers & ui::EF_CONTROL_DOWN) << ", "
+        << (entry.modifiers & ui::EF_ALT_DOWN);
+  }
+
+  std::set<AcceleratorAction> actions;
+  for (size_t i = 0; i < kDeprecatedAcceleratorsDataLength; ++i) {
+    // There must never be any duplicated actions.
+    const DeprecatedAcceleratorData& data = kDeprecatedAcceleratorsData[i];
+    EXPECT_TRUE(actions.insert(data.action).second) << "Deprecated action: "
+                                                    << data.action;
 
     // The UMA histogram name must be of the format "Ash.Accelerators.*"
-    std::string uma_histogram(kDeprecatedAccelerators[i].uma_histogram_name);
-    EXPECT_TRUE(uma_histogram.find("Ash.Accelerators.") != std::string::npos);
-    EXPECT_TRUE(uma_histogram.find("Ash.Accelerators.") == 0);
+    std::string uma_histogram(data.uma_histogram_name);
+    EXPECT_TRUE(base::StartsWith(uma_histogram, "Ash.Accelerators.",
+                                 base::CompareCase::SENSITIVE));
   }
 }
 
diff --git a/ash/accelerators/debug_commands.cc b/ash/accelerators/debug_commands.cc
index fe4589d..4e7a4e8 100644
--- a/ash/accelerators/debug_commands.cc
+++ b/ash/accelerators/debug_commands.cc
@@ -13,8 +13,11 @@
 #include "ash/host/ash_window_tree_host.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
+#include "ash/shell_delegate.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkPaint.h"
 #include "ui/aura/window.h"
@@ -123,6 +126,22 @@
   }
 }
 
+#if defined(OS_CHROMEOS)
+
+void HandleToggleTouchpad() {
+  base::RecordAction(base::UserMetricsAction("Accel_Toggle_Touchpad"));
+
+  ash::Shell::GetInstance()->delegate()->ToggleTouchpad();
+}
+
+void HandleToggleTouchscreen() {
+  base::RecordAction(base::UserMetricsAction("Accel_Toggle_Touchscreen"));
+
+  ash::Shell::GetInstance()->delegate()->ToggleTouchscreen();
+}
+
+#endif  // defined(OS_CHROMEOS)
+
 }  // namespace
 
 void PrintUIHierarchies() {
@@ -148,6 +167,12 @@
     case DEBUG_ADD_REMOVE_DISPLAY:
       Shell::GetInstance()->display_manager()->AddRemoveDisplay();
       break;
+    case DEBUG_TOGGLE_TOUCH_PAD:
+      HandleToggleTouchpad();
+      break;
+    case DEBUG_TOGGLE_TOUCH_SCREEN:
+      HandleToggleTouchscreen();
+      break;
     case DEBUG_TOGGLE_UNIFIED_DESKTOP:
       Shell::GetInstance()->display_manager()->SetUnifiedDesktopEnabled(
           !Shell::GetInstance()->display_manager()->unified_desktop_enabled());
diff --git a/ash/ash_chromeos_strings.grdp b/ash/ash_chromeos_strings.grdp
index 3adf983b..1643094 100644
--- a/ash/ash_chromeos_strings.grdp
+++ b/ash/ash_chromeos_strings.grdp
@@ -441,12 +441,35 @@
   </message>
 
   <!-- Deprecated Accelerators Messages -->
+  <!-- Shortcut keys MUST be connected with pluses (e.g. Ctrl+Shift+L). -->
+  <message name="IDS_SHORTCUT_LOCK_SCREEN_OLD" desc="the old deprecated shortcut to lock the screen.">
+    Ctrl+Shift+L
+  </message>
+  <message name="IDS_SHORTCUT_LOCK_SCREEN_NEW" desc="the new shortcut to lock the screen.">
+    Search+L
+  </message>
+  <message name="IDS_SHORTCUT_TASK_MANAGER_OLD" desc="the old deprecated shortcut to open the task manager.">
+    Shift+Esc
+  </message>
+  <message name="IDS_SHORTCUT_TASK_MANAGER_NEW" desc="the new shortcut to open the task manager.">
+    Search+Esc
+  </message>
+  <message name="IDS_SHORTCUT_NEXT_IME_OLD" desc="the old deprecated shortcut to switch to the next input method.">
+    Shift+Alt
+  </message>
+  <message name="IDS_SHORTCUT_NEXT_IME_NEW" desc="the new shortcut to switch to the next input method.">
+    Ctrl+Shift+Space
+  </message>
   <message name="IDS_DEPRECATED_LOCK_SCREEN_MSG"
            desc="Notification message to tell users about the deprecation of Ctrl+Shift+L shortcut to lock the screen.">
-    The screen lock shortcut has changed. Please use Search+L instead of Ctrl+Shift+L.
+    The shortcut to lock the screen has changed. Please use <ph name="NEW_SHORTCUT">$1<ex>Search+L</ex></ph> instead of <ph name="OLD_SHORTCUT">$2<ex>Ctrl+Shift+L</ex></ph>.
   </message>
   <message name="IDS_DEPRECATED_SHOW_TASK_MANAGER_MSG"
            desc="Notification message to tell users about the deprecation of Shift+ESC shortcut to show the task manager.">
-    The task manager shortcut has changed. Please use Search+Esc instead of Shift+Esc.
+    The shortcut to open the task manager has changed. Please use <ph name="NEW_SHORTCUT">$1<ex>Search+Esc</ex></ph> instead of <ph name="OLD_SHORTCUT">$2<ex>Shift+Esc</ex></ph>.
+  </message>
+  <message name="IDS_DEPRECATED_NEXT_IME_MSG"
+           desc="Notification message to tell users about the deprecation of Shift+Alt shortcut to switch to the next input method.">
+    The shortcut to switch to the next input method has changed. Please use <ph name="NEW_SHORTCUT">$1<ex>Ctrl+Shift+Space</ex></ph> instead of <ph name="OLD_SHORTCUT">$2<ex>Shift+Alt</ex></ph>.
   </message>
 </grit-part>
diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h
index f2c3971..e378e77 100644
--- a/ash/shell_delegate.h
+++ b/ash/shell_delegate.h
@@ -162,6 +162,10 @@
   virtual void OpenKeyboardShortcutHelpPage() const {}
 
   virtual gfx::Image GetDeprecatedAcceleratorImage() const = 0;
+
+  // Toggles the status of the touchpad / touchscreen on or off.
+  virtual void ToggleTouchpad() {}
+  virtual void ToggleTouchscreen() {}
 };
 
 }  // namespace ash
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index df5e292..6472995 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">ቆልፍ</translation>
 <translation id="3799026279081545374">መጥፎ የኃይል መሙያ ሊኖርዎት ይችላል። በአሜሪካ ውስጥ የሚኖሩ ከሆኑ እርዳታን እና መተኪያን ለማግኘት እባክዎ ወደ 866-628-1371 ይደውሉ። በዩኬ ውስጥ የሚኖሩ ከሆኑ እባክዎ ወደ 0800-026-0613 ይደውሉ። በአየርላንድ ውስጥ የሚሆኑ ከሆኑ እባክዎ ወደ 1-800-832-664 ይደውሉ። በካናዳ ውስጥ የሚኖሩ ከሆኑ እባክዎ ወደ 866-628-1372 ይደውሉ። በአውስትራሊያ ውስጥ የሚኖሩ ከሆኑ እባክዎ ወደ 1-800-067-460 ይደውሉ።</translation>
+<translation id="3866182280516392520">IPv6 አድራሻ</translation>
 <translation id="3891340733213178823">ዘግተው ለመውጣት Ctrl+Shift+Qን ሁለቴ ይጫኑ።</translation>
 <translation id="3892641579809465218">የውስጥ ማሳያ</translation>
 <translation id="3963445509666917109">ድምጽ ማጉያ (ውስጣዊ)</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 95fcc36..6b270b27 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -93,6 +93,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">قفل</translation>
 <translation id="3799026279081545374">‏قد يكون الشاحن غير صالح. إذا كنت مقيمًا في الولايات المتحدة، فالرجاء الاتصال بالرقم ‎866-628-1371 للحصول على مساعدة واستبدال الشاحن. وإذا كنت مقيمًا في المملكة المتحدة، فالرجاء الاتصال بالرقم ‎0800-026-0613. وإذا كنت مقيمًا في أيرلندا، فالرجاء الاتصال بالرقم ‎1-800-832-664. وإذا كنت مقيمًا في كندا، فالرجاء الاتصال بالرقم ‎866-628-1372. وإذا كنت مقيمًا في أستراليا، فالرجاء الاتصال بالرقم ‎1-800-067-460.</translation>
+<translation id="3866182280516392520">‏عنوان IPv6</translation>
 <translation id="3891340733213178823">‏للخروج اضغط على Ctrl+Shift+Q مرتين.</translation>
 <translation id="3892641579809465218">العرض الداخلي</translation>
 <translation id="3963445509666917109">سماعة (داخلية)</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 8a73a4d..a80164f 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">Κλείδωμα</translation>
 <translation id="3799026279081545374">Ενδέχεται ο φορτιστής σας να έχει κάποια βλάβη. Εάν διαμένετε στις ΗΠΑ, καλέστε στο 866-628-1371 για να λάβετε βοήθεια και υλικό αντικατάστασης. Εάν διαμένετε στο ΗΒ, καλέστε στο 0800-026-0613. Εάν διαμένετε στην Ιρλανδία, καλέστε στο 1-800-832-664. Εάν διαμένετε στον Καναδά, καλέστε στο 866-628-1372. Εάν διαμένετε στην Αυστραλία, καλέστε στο 1-800-067-460.</translation>
+<translation id="3866182280516392520">Διεύθυνση IPv6</translation>
 <translation id="3891340733213178823">Πατήστε Ctrl + Shift + Q δύο φορές για να αποσυνδεθείτε.</translation>
 <translation id="3892641579809465218">Εσωτερική οθόνη</translation>
 <translation id="3963445509666917109">Ηχείο (Εσωτερικό)</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 6cb7203..6d6270f51 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">Lock</translation>
 <translation id="3799026279081545374">You may have a bad charger. If you live in the US, please call 866-628-1371 in order to receive help and a replacement. If you live in the UK, please call 0800-026-0613. If you live in Ireland, please call 1-800-832-664. If you live in Canada, please call 866-628-1372. If you live in Australia, please call 1-800-067-460.</translation>
+<translation id="3866182280516392520">IPv6 Address</translation>
 <translation id="3891340733213178823">Press Ctrl+Shift+Q twice to sign out.</translation>
 <translation id="3892641579809465218">Internal Display</translation>
 <translation id="3963445509666917109">Speaker (Internal)</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index b70ab88..f56f7a5 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">I-lock</translation>
 <translation id="3799026279081545374">Maaaring mayroon kang hindi magandang charger. Kung nakatira ka sa US, mangyaring tumawag sa 866-628-1371 upang makatanggap ng tulong at ng kapalit. Kung nakatira ka sa UK, mangyaring tumawag sa 0800-026-0613. Kung nakatira ka sa Ireland, mangyaring tumawag sa 1-800-832-664. Kung nakatira ka sa Canada, mangyaring tumawag sa 866-628-1372. Kung nakatira ka sa Australia, mangyaring tumawag sa 1-800-067-460.</translation>
+<translation id="3866182280516392520">IPv6 Address</translation>
 <translation id="3891340733213178823">Pindutin ang Ctrl+Shift+Q nang dalawang beses upang mag-sign out.</translation>
 <translation id="3892641579809465218">Panloob na Display</translation>
 <translation id="3963445509666917109">Speaker (Internal)</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index ce70e9f..33b6241 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">Kunci</translation>
 <translation id="3799026279081545374">Mungkin Anda memiliki pengisi daya yang tidak bagus. Apabila Anda tinggal di AS, hubungi 866-628-1371 untuk mendapatkan bantuan dan pengganti. Apabila Anda tinggal di Inggris, hubungi 0800-026-0613. Apabila Anda tinggal di Irlandia, hubungi 1-800-832-664. Apabila Anda tinggal di Kanada, hubungi 866-628-1372. Apabila Anda tinggal di Australia, hubungi 1-800-067-460.</translation>
+<translation id="3866182280516392520">Alamat IPv6</translation>
 <translation id="3891340733213178823">Tekan Ctrl+Shift+Q dua kali untuk keluar.</translation>
 <translation id="3892641579809465218">Tampilan Internal</translation>
 <translation id="3963445509666917109">Pengeras Suara (Internal)</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index fe5c9f5..bdc7269 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">נעילה</translation>
 <translation id="3799026279081545374">ייתכן שהמטען שברשותך פגום. אם אתה מתגורר בארה"ב, התקשר למספר 866-628-1371 כדי לקבל עזרה ומטען חלופי. אם אתה מתגורר בבריטניה, התקשר למספר 0800-026-0613. אם אתה מתגורר באירלנד, התקשר למספר 1-800-832-664. אם אתה מתגורר בקנדה, התקשר למספר 866-628-1372. אם אתה מתגורר באוסטרליה, התקשר למספר 1-800-067-460.</translation>
+<translation id="3866182280516392520">‏כתובת IPv6</translation>
 <translation id="3891340733213178823">‏הקש פעמיים על Ctrl+Shift+Q כדי לצאת.</translation>
 <translation id="3892641579809465218">תצוגה פנימית</translation>
 <translation id="3963445509666917109">רמקול (פנימי)</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index 7a70b1d..18345ef 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -93,6 +93,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">Kunci</translation>
 <translation id="3799026279081545374">Anda mungkin mempunyai pengecas yang rosak. Jika anda tinggal di AS, sila hubungi 866-628-1371866-628-1371 untuk mendapatkan bantuan dan pengecas ganti. Jika anda tinggal di UK, sila hubungi 0800-026-06130800-026-0613. Jika anda tinggal di Ireland, sila hubungi 1-800-832-664. Jika anda tinggal di Kanada, sila hubungi 866-628-1372866-628-1372. Jika anda tinggal di Australia, sila hubungi 1-800-067-460.</translation>
+<translation id="3866182280516392520">Alamat IPv6</translation>
 <translation id="3891340733213178823">Tekan Ctrl+Shift+Q dua kali untuk keluar.</translation>
 <translation id="3892641579809465218">Paparan Dalaman</translation>
 <translation id="3963445509666917109">Pembesar Suara (Dalaman)</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 34f6ccd3..d85fbcd 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -94,6 +94,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">Uzamknúť</translation>
 <translation id="3799026279081545374">Je možné, že máte chybnú nabíjačku. Ak žijete v USA, požiadajte o pomoc a výmenu na čísle 866-628-1371. Ak žijete v Spojenom kráľovstve, volajte na číslo 0800-026-0613. Ak žijete v Írsku, volajte na číslo 1-800-832-664. Ak žijete v Kanade, volajte na číslo 866-628-1372. Ak žijete v Austrálii, volajte na číslo 1-800-067-460.</translation>
+<translation id="3866182280516392520">Adresa IPv6</translation>
 <translation id="3891340733213178823">Ak sa chcete odhlásiť, stlačte dvakrát kombináciu klávesov Ctrl+Shift+Q.</translation>
 <translation id="3892641579809465218">Interný displej</translation>
 <translation id="3963445509666917109">Reproduktor (vnútorný)</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 59416283..0dc96cb 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -93,6 +93,7 @@
 <translation id="3783640748446814672">alt</translation>
 <translation id="3784455785234192852">Lås</translation>
 <translation id="3799026279081545374">Du har kanske fått en dålig laddare. Ring 866-628-1371 för att få hjälp om du bor i USA. Ring 0800-026-0613 om du bor i Storbritannien. Ring 1-800-832-664 om du bor i Irland. Ring 866-628-1372 om du bor i Kanada. Ring 1-800-067-460 om du bor i Australien.</translation>
+<translation id="3866182280516392520">IPv6-adress</translation>
 <translation id="3891340733213178823">Tryck på Ctrl+Skift+Q två gånger om du vill logga ut.</translation>
 <translation id="3892641579809465218">Intern bildskärm</translation>
 <translation id="3963445509666917109">Högtalare (inbyggd)</translation>
diff --git a/ash/wm/maximize_mode/maximize_mode_controller.cc b/ash/wm/maximize_mode/maximize_mode_controller.cc
index 50403ec..c732863 100644
--- a/ash/wm/maximize_mode/maximize_mode_controller.cc
+++ b/ash/wm/maximize_mode/maximize_mode_controller.cc
@@ -301,6 +301,9 @@
             HasSwitch(switches::kAshEnableTouchViewTesting)) {
       EnterMaximizeMode();
     }
+    // Always reset first to avoid creation before destruction of a previous
+    // object.
+    event_blocker_.reset();
 #if defined(USE_X11)
     event_blocker_.reset(new ScopedDisableInternalMouseAndKeyboardX11);
 #elif defined(USE_OZONE)
diff --git a/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.cc b/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.cc
index a6d0b64..41f48491 100644
--- a/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.cc
+++ b/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.cc
@@ -18,10 +18,11 @@
     ScopedDisableInternalMouseAndKeyboardOzone() {
   ui::InputController* input_controller =
       ui::OzonePlatform::GetInstance()->GetInputController();
-  if (input_controller->HasTouchpad()) {
+  if (input_controller->HasTouchpad() &&
+      input_controller->IsInternalTouchpadEnabled()) {
+    should_ignore_touch_pad_ = false;
     input_controller->SetInternalTouchpadEnabled(false);
-    aura::client::GetCursorClient(Shell::GetInstance()->GetPrimaryRootWindow())
-        ->HideCursor();
+    Shell::GetInstance()->cursor_manager()->HideCursor();
   }
 
   // Allow the acccessible keys present on the side of some devices to continue
@@ -38,7 +39,12 @@
     ~ScopedDisableInternalMouseAndKeyboardOzone() {
   ui::InputController* input_controller =
       ui::OzonePlatform::GetInstance()->GetInputController();
-  input_controller->SetInternalTouchpadEnabled(true);
+
+  if (!should_ignore_touch_pad_) {
+    input_controller->SetInternalTouchpadEnabled(true);
+    Shell::GetInstance()->cursor_manager()->ShowCursor();
+  }
+
   input_controller->SetInternalKeyboardFilter(false /* enable_filter */,
                                               std::vector<ui::DomCode>());
 }
diff --git a/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.h b/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.h
index 2376504..6783fcb 100644
--- a/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.h
+++ b/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone.h
@@ -19,6 +19,10 @@
   ~ScopedDisableInternalMouseAndKeyboardOzone() override;
 
  private:
+  // If the touch pad is already disabled we ignore re-enabling it in the
+  // destructor.
+  bool should_ignore_touch_pad_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(ScopedDisableInternalMouseAndKeyboardOzone);
 };
 
diff --git a/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.cc b/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.cc
index 7704394..2f7fde2 100644
--- a/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.cc
+++ b/ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.cc
@@ -73,8 +73,7 @@
       last_mouse_location_(GetMouseLocationInScreen()) {
 
   ui::DeviceDataManagerX11* device_data_manager =
-      static_cast<ui::DeviceDataManagerX11*>(
-          ui::DeviceDataManager::GetInstance());
+      ui::DeviceDataManagerX11::GetInstance();
   if (device_data_manager->IsXInput2Available()) {
     const XIDeviceList& xi_dev_list =
         ui::DeviceListCacheX11::GetInstance()->GetXI2DeviceList(
@@ -83,10 +82,14 @@
       std::string device_name(xi_dev_list[i].name);
       base::TrimWhitespaceASCII(device_name, base::TRIM_TRAILING, &device_name);
       if (device_name == kInternalTouchpadName) {
-        touchpad_device_id_ = xi_dev_list[i].deviceid;
-        device_data_manager->DisableDevice(touchpad_device_id_);
-        aura::client::GetCursorClient(
-            Shell::GetInstance()->GetPrimaryRootWindow())->HideCursor();
+        if (device_data_manager->IsDeviceEnabled(xi_dev_list[i].deviceid)) {
+          // If the touchpad is already disabled we will do nothing about it.
+          // This will result in doing nothing in the destructor as well since
+          // |touchpad_device_id_| will remain |kDeviceIdNone|.
+          touchpad_device_id_ = xi_dev_list[i].deviceid;
+          device_data_manager->DisableDevice(touchpad_device_id_);
+          Shell::GetInstance()->cursor_manager()->HideCursor();
+        }
       } else if (device_name == kCoreKeyboardName) {
         core_keyboard_device_id_ = xi_dev_list[i].deviceid;
         device_data_manager->DisableDevice(core_keyboard_device_id_);
@@ -118,8 +121,10 @@
   ui::DeviceDataManagerX11* device_data_manager =
       static_cast<ui::DeviceDataManagerX11*>(
           ui::DeviceDataManager::GetInstance());
-  if (touchpad_device_id_ != kDeviceIdNone)
+  if (touchpad_device_id_ != kDeviceIdNone) {
     device_data_manager->EnableDevice(touchpad_device_id_);
+    Shell::GetInstance()->cursor_manager()->ShowCursor();
+  }
   if (keyboard_device_id_ != kDeviceIdNone)
     device_data_manager->EnableDevice(keyboard_device_id_);
   if (core_keyboard_device_id_ != kDeviceIdNone)
diff --git a/base/trace_event/common/trace_event_common.h b/base/trace_event/common/trace_event_common.h
index 9a61b19b..33578bd3 100644
--- a/base/trace_event/common/trace_event_common.h
+++ b/base/trace_event/common/trace_event_common.h
@@ -403,14 +403,11 @@
                            TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val,   \
                            arg2_name, arg2_val)
 
-#define TRACE_EVENT_MARK(category_group, name)                           \
-  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \
-                           TRACE_EVENT_FLAG_NONE)
-
-#define TRACE_EVENT_MARK_WITH_TIMESTAMP(category_group, name, timestamp) \
-  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                    \
-      TRACE_EVENT_PHASE_MARK, category_group, name, 0, 0, timestamp,     \
-      TRACE_EVENT_FLAG_NONE)
+#define TRACE_EVENT_MARK_WITH_TIMESTAMP1(category_group, name, timestamp, \
+                                         arg1_name, arg1_val)             \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
+      TRACE_EVENT_PHASE_MARK, category_group, name, 0, 0, timestamp,      \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
 
 #define TRACE_EVENT_COPY_MARK(category_group, name)                      \
   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \
diff --git a/blimp/client/BUILD.gn b/blimp/client/BUILD.gn
index bccbf44f..77ae98d 100644
--- a/blimp/client/BUILD.gn
+++ b/blimp/client/BUILD.gn
@@ -13,10 +13,18 @@
     "compositor/blimp_compositor.h",
     "compositor/blimp_context_provider.cc",
     "compositor/blimp_context_provider.h",
+    "compositor/blimp_layer_tree_settings.cc",
+    "compositor/blimp_layer_tree_settings.h",
     "compositor/blimp_output_surface.cc",
     "compositor/blimp_output_surface.h",
     "compositor/test/dummy_layer_driver.cc",
     "compositor/test/dummy_layer_driver.h",
+
+    # TODO(dtrainor): Remove this once the LayerTreeHost settings for Blimp
+    # are finalized or are pushed from the server component.  See
+    # crbug.com/527655.
+    "../../content/public/common/content_switches.cc",
+    "../../ui/native_theme/native_theme_switches.cc",
   ]
 
   deps = [
diff --git a/blimp/client/DEPS b/blimp/client/DEPS
index 71d9cb4..dc443c4 100644
--- a/blimp/client/DEPS
+++ b/blimp/client/DEPS
@@ -13,4 +13,10 @@
 
   # TODO(dtrainor): Remove this once Toast uses are removed from Java.
   "!ui/android",
+
+  # TODO(dtrainor): Remove this once the LayerTreeHost settings for Blimp
+  # are finalized or are pushed from the server component.  See
+  # crbug.com/527655.
+  "!content/public/common/content_switches.h",
+  "!ui/native_theme/native_theme_switches.h",
 ]
diff --git a/blimp/client/compositor/blimp_compositor.cc b/blimp/client/compositor/blimp_compositor.cc
index 45156842..5f2b1fa2 100644
--- a/blimp/client/compositor/blimp_compositor.cc
+++ b/blimp/client/compositor/blimp_compositor.cc
@@ -13,9 +13,9 @@
 #include "base/threading/thread_local.h"
 #include "base/threading/thread_restrictions.h"
 #include "blimp/client/compositor/blimp_context_provider.h"
+#include "blimp/client/compositor/blimp_layer_tree_settings.h"
 #include "blimp/client/compositor/blimp_output_surface.h"
 #include "blimp/client/compositor/test/dummy_layer_driver.h"
-#include "blimp/common/compositor/blimp_layer_tree_settings.h"
 #include "blimp/common/compositor/blimp_task_graph_runner.h"
 #include "cc/layers/layer.h"
 #include "cc/output/output_surface.h"
diff --git a/blimp/common/compositor/blimp_layer_tree_settings.cc b/blimp/client/compositor/blimp_layer_tree_settings.cc
similarity index 99%
rename from blimp/common/compositor/blimp_layer_tree_settings.cc
rename to blimp/client/compositor/blimp_layer_tree_settings.cc
index 7e2d402..159c323 100644
--- a/blimp/common/compositor/blimp_layer_tree_settings.cc
+++ b/blimp/client/compositor/blimp_layer_tree_settings.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "blimp/common/compositor/blimp_layer_tree_settings.h"
+#include "blimp/client/compositor/blimp_layer_tree_settings.h"
 
 #include "base/command_line.h"
 #include "base/logging.h"
diff --git a/blimp/client/compositor/blimp_layer_tree_settings.h b/blimp/client/compositor/blimp_layer_tree_settings.h
new file mode 100644
index 0000000..1d7160e
--- /dev/null
+++ b/blimp/client/compositor/blimp_layer_tree_settings.h
@@ -0,0 +1,30 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BLIMP_CLIENT_COMPOSITOR_BLIMP_LAYER_TREE_SETTINGS_H_
+#define BLIMP_CLIENT_COMPOSITOR_BLIMP_LAYER_TREE_SETTINGS_H_
+
+namespace base {
+class CommandLine;
+}
+
+namespace cc {
+class LayerTreeSettings;
+}
+
+namespace gfx {
+class Size;
+}
+
+namespace blimp {
+
+// Populates client |settings| based on defaults & command line flags.  This
+// might have to be tweaked into a message protocol if it turns out
+// the host compositor needs to actually drive some specific settings of the
+// client.
+void PopulateCommonLayerTreeSettings(cc::LayerTreeSettings* settings);
+
+}  // namespace blimp
+
+#endif  // BLIMP_CLIENT_COMPOSITOR_BLIMP_LAYER_TREE_SETTINGS_H_
diff --git a/blimp/common/BUILD.gn b/blimp/common/BUILD.gn
index 07bc2fa..17e52f7 100644
--- a/blimp/common/BUILD.gn
+++ b/blimp/common/BUILD.gn
@@ -7,15 +7,8 @@
 component("blimp_common") {
   sources = [
     "blimp_common_export.h",
-    "compositor/blimp_layer_tree_settings.cc",
-    "compositor/blimp_layer_tree_settings.h",
     "compositor/blimp_task_graph_runner.cc",
     "compositor/blimp_task_graph_runner.h",
-
-    # TODO(dtrainor): Remove this once the LayerTreeHost settings for Blimp
-    # are finalized or are pushed from the server component.  See
-    # crbug.com/527655.
-    "../../content/public/common/content_switches.cc",
   ]
 
   defines = [ "BLIMP_COMMON_IMPLEMENTATION=1" ]
diff --git a/blimp/common/DEPS b/blimp/common/DEPS
index e163777..bfe76e26 100644
--- a/blimp/common/DEPS
+++ b/blimp/common/DEPS
@@ -6,12 +6,4 @@
   "+third_party/skia",
   "+ui/gfx",
   "+ui/gl",
-
-  # TODO(dtrainor): Verify we still need this.
-  "!ui/native_theme/native_theme_switches.h",
-
-  # TODO(dtrainor): Remove this once the LayerTreeHost settings for Blimp
-  # are finalized or are pushed from the server component.  See
-  # crbug.com/527655.
-  "!content/public/common/content_switches.h",
 ]
diff --git a/blimp/common/compositor/blimp_layer_tree_settings.h b/blimp/common/compositor/blimp_layer_tree_settings.h
deleted file mode 100644
index ddbabbc..0000000
--- a/blimp/common/compositor/blimp_layer_tree_settings.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BLIMP_COMMON_COMPOSITOR_BLIMP_LAYER_TREE_SETTINGS_H_
-#define BLIMP_COMMON_COMPOSITOR_BLIMP_LAYER_TREE_SETTINGS_H_
-
-#include "blimp/common/blimp_common_export.h"
-
-namespace base {
-class CommandLine;
-}
-
-namespace cc {
-class LayerTreeSettings;
-}
-
-namespace gfx {
-class Size;
-}
-
-namespace blimp {
-
-// Populates shared server/client |settings| based on defaults & command line
-// flags.  This might have to be tweaked into a message protocol if it turns out
-// the host compositor needs to actually drive some specific settings of the
-// client.
-BLIMP_COMMON_EXPORT void PopulateCommonLayerTreeSettings(
-    cc::LayerTreeSettings* settings);
-
-}  // namespace blimp
-
-#endif  // BLIMP_COMMON_COMPOSITOR_BLIMP_LAYER_TREE_SETTINGS_H_
diff --git a/build/filename_rules.gypi b/build/filename_rules.gypi
index 3766273..291bfedb 100644
--- a/build/filename_rules.gypi
+++ b/build/filename_rules.gypi
@@ -14,8 +14,8 @@
                     ['exclude', '(^|/)win_[^/]*\\.(h|cc)$'] ],
     }],
     ['OS!="mac" or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_(cocoa|mac)(_unittest)?\\.(h|cc|c|mm?)$'],
-                    ['exclude', '(^|/)(cocoa|mac)/'] ],
+      'sources/': [ ['exclude', '_(cocoa|mac|mach)(_unittest)?\\.(h|cc|c|mm?)$'],
+                    ['exclude', '(^|/)(cocoa|mac|mach)/'] ],
     }],
     ['OS!="ios" or >(nacl_untrusted_build)==1', {
       'sources/': [ ['exclude', '_ios(_unittest)?\\.(h|cc|mm?)$'],
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index 1fcd851c..cb5ec20 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -102,16 +102,16 @@
           language-pack-fr language-pack-he language-pack-zh-hant
           libapache2-mod-php5 libasound2-dev libbrlapi-dev libav-tools
           libbz2-dev libcairo2-dev libcap-dev libcups2-dev libcurl4-gnutls-dev
-          libdrm-dev libelf-dev libexif-dev libgconf2-dev libglib2.0-dev
-          libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev libkrb5-dev
-          libnspr4-dev libnss3-dev libpam0g-dev libpci-dev libpulse-dev
-          libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev libudev-dev
-          libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev openbox
-          patch perl php5-cgi pkg-config python python-cherrypy3 python-crypto
-          python-dev python-numpy python-opencv python-openssl python-psutil
-          python-yaml rpm ruby subversion ttf-dejavu-core ttf-indic-fonts
-          ttf-kochi-gothic ttf-kochi-mincho wdiff xfonts-mathml zip
-          $chromeos_dev_list"
+          libdrm-dev libelf-dev libexif-dev libffi-dev libgconf2-dev
+          libglib2.0-dev libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev
+          libkrb5-dev libnspr4-dev libnss3-dev libpam0g-dev libpci-dev
+          libpulse-dev libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev
+          libudev-dev libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev
+          openbox patch perl php5-cgi pkg-config python python-cherrypy3
+          python-crypto python-dev python-numpy python-opencv python-openssl
+          python-psutil python-yaml rpm ruby subversion ttf-dejavu-core
+          ttf-indic-fonts ttf-kochi-gothic ttf-kochi-mincho wdiff xfonts-mathml
+          zip $chromeos_dev_list"
 
 # 64-bit systems need a minimum set of 32-bit compat packages for the pre-built
 # NaCl binaries.
@@ -124,15 +124,15 @@
 
 # Full list of required run-time libraries
 lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcap2 libcups2 libexpat1
-          libexif12 libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0
-          libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 libpixman-1-0
-          libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6
+          libexif12 libffi6 libfontconfig1 libfreetype6 libglib2.0-0
+          libgnome-keyring0 libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3
+          libpixman-1-0 libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6
           libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6
           libxext6 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1
           libxtst6 zlib1g $chromeos_lib_list"
 
 # Debugging symbols for all of the run-time libraries
-dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg libfontconfig1-dbg
+dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg libffi6-dbg libfontconfig1-dbg
           libglib2.0-0-dbg libgtk2.0-0-dbg libpango1.0-0-dbg libpcre3-dbg
           libpixman-1-0-dbg libsqlite3-0-dbg libx11-6-dbg libxau6-dbg
           libxcb1-dbg libxcomposite1-dbg libxcursor1-dbg libxdamage1-dbg
diff --git a/build/toolchain/gcc_link_wrapper.py b/build/toolchain/gcc_link_wrapper.py
new file mode 100755
index 0000000..74eb460
--- /dev/null
+++ b/build/toolchain/gcc_link_wrapper.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Runs a linking command and optionally a strip command.
+
+This script exists to avoid using complex shell commands in
+gcc_toolchain.gni's tool("link"), in case the host running the compiler
+does not have a POSIX-like shell (e.g. Windows).
+"""
+
+import argparse
+import subprocess
+import sys
+
+
+def main():
+  parser = argparse.ArgumentParser(description=__doc__)
+  parser.add_argument('--strip',
+                      help='The strip binary to run',
+                      metavar='PATH')
+  parser.add_argument('--unstripped-file',
+                      required=True,
+                      help='Executable file produced by linking command',
+                      metavar='FILE')
+  parser.add_argument('--output',
+                      required=True,
+                      help='Final output executable file',
+                      metavar='FILE')
+  parser.add_argument('command', nargs='+',
+                      help='Linking command')
+  args = parser.parse_args()
+
+  # First, run the actual link.
+  result = subprocess.call(args.command)
+  if result != 0:
+    return result
+
+  # Finally, strip the linked executable (if desired).
+  if args.strip:
+    result = subprocess.call([args.strip, '--strip-unneeded',
+                              '-o', args.output, args.unstripped_file])
+
+  return result
+
+
+if __name__ == "__main__":
+  sys.exit(main())
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index 6746f5e..d6a9002ea 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -212,13 +212,15 @@
         gold_plugin_path = rebase_path(
                 "//third_party/llvm-build/Release+Asserts/lib/LLVMgold.so",
                 root_build_dir)
-        arflags = "--plugin $gold_plugin_path"
+        arflags = "--plugin \"$gold_plugin_path\""
       }
 
       # This needs a Python script to avoid using simple sh features in this
-      # command, in case the host does not use a POSIX shell (e.g. Windows).
-      ar_wrapper = rebase_path("//build/toolchain/gcc_ar_wrapper.py")
-      command = "$python_path $ar_wrapper --output={{output}} --ar=$ar $arflags rcs @$rspfile"
+      # command, in case the host does not use a POSIX shell (e.g. compiling
+      # POSIX-like toolchains such as NaCl on Windows).
+      ar_wrapper =
+          rebase_path("//build/toolchain/gcc_ar_wrapper.py", root_build_dir)
+      command = "$python_path \"$ar_wrapper\" --output={{output}} --ar=$ar $arflags rcs @\"$rspfile\""
       description = "AR {{output}}"
       rspfile_content = "{{inputs}}"
       outputs = [
@@ -247,7 +249,7 @@
       # .TOC file, overwrite it, otherwise, don't change it.
       tocfile = sofile + ".TOC"
 
-      link_command = "$ld -shared {{ldflags}} -o $unstripped_sofile -Wl,-soname=$soname @$rspfile"
+      link_command = "$ld -shared {{ldflags}} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\""
 
       assert(defined(readelf), "to solink you must have a readelf")
       assert(defined(nm), "to solink you must have an nm")
@@ -260,7 +262,7 @@
       # requiring sh control structures, pipelines, and POSIX utilities.
       # The host might not have a POSIX shell and utilities (e.g. Windows).
       solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py")
-      command = "$python_path $solink_wrapper --readelf=$readelf --nm=$nm $strip_switch --sofile=$unstripped_sofile --tocfile=$tocfile --output=$sofile -- $link_command"
+      command = "$python_path $solink_wrapper --readelf=$readelf --nm=$nm $strip_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\" --output=\"$sofile\" -- $link_command"
 
       rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
 
@@ -304,11 +306,10 @@
         unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname"
       }
 
-      command = "$ld -shared {{ldflags}} -o $unstripped_sofile -Wl,-soname=$soname @$rspfile"
+      command = "$ld -shared {{ldflags}} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\""
 
       if (defined(invoker.strip)) {
-        strip_command =
-            "${invoker.strip} --strip-unneeded -o $sofile $unstripped_sofile"
+        strip_command = "${invoker.strip} --strip-unneeded -o \"$sofile\" \"$unstripped_sofile\""
         command += " && " + strip_command
       }
       rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
@@ -345,14 +346,11 @@
         unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename"
       }
 
-      command = "$ld {{ldflags}} -o $unstripped_outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix"
+      command = "$ld {{ldflags}} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix"
       if (defined(invoker.strip)) {
-        strip_command =
-            "${invoker.strip} --strip-unneeded -o $outfile $unstripped_outfile"
-        command += " && " + strip_command
-      }
-      if (defined(invoker.postlink)) {
-        command += " && " + invoker.postlink
+        link_wrapper =
+            rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir)
+        command = "$python_path \"$link_wrapper\" --strip=${invoker.strip} --unstripped-file=\"$unstripped_outfile\" --output=\"$outfile\" -- $command"
       }
       description = "LINK $outfile"
       rspfile_content = "{{inputs}}"
diff --git a/build/toolchain/nacl/BUILD.gn b/build/toolchain/nacl/BUILD.gn
index bf31e84..23f1027f 100644
--- a/build/toolchain/nacl/BUILD.gn
+++ b/build/toolchain/nacl/BUILD.gn
@@ -32,19 +32,22 @@
       rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/pnacl-",
                   root_build_dir)
 
+  executable_extension = ".pexe"
+
   is_clang = true
   cc = toolprefix + "clang"
   cxx = toolprefix + "clang++"
   ar = toolprefix + "ar"
   ld = cxx
-  executable_extension = ".pexe.debug"
 
-  finalize = toolprefix + "finalize"
-  nonfinal_file =
-      "{{root_out_dir}}/{{target_output_name}}${executable_extension}"
-  finalized_file = "{{root_out_dir}}/{{target_output_name}}.pexe"
-  postlink = "$finalize $nonfinal_file -o $finalized_file"
-  link_outputs = [ finalized_file ]
+  # The pnacl-finalize tool turns a .pexe.debug file into a .pexe file.
+  # It's very similar in purpose to the traditional "strip" utility: it
+  # turns what comes out of the linker into what you actually want to
+  # distribute and run.  PNaCl doesn't have a "strip"-like utility that
+  # you ever actually want to use other than pnacl-finalize, so just
+  # make pnacl-finalize the strip tool rather than adding an additional
+  # step like "postlink" to run pnacl-finalize.
+  strip = toolprefix + "finalize"
 }
 
 nacl_toolchain("newlib_pnacl_nonsfi") {
diff --git a/build/toolchain/nacl_toolchain.gni b/build/toolchain/nacl_toolchain.gni
index 576fed9..fa790386 100644
--- a/build/toolchain/nacl_toolchain.gni
+++ b/build/toolchain/nacl_toolchain.gni
@@ -42,7 +42,6 @@
                              "is_nacl_glibc",
                              "ld",
                              "link_outputs",
-                             "postlink",
                              "symbol_level",
                              "strip",
                              "toolchain_cpu",
diff --git a/cc/layers/layer_position_constraint_unittest.cc b/cc/layers/layer_position_constraint_unittest.cc
index 594dac2..9c15a650 100644
--- a/cc/layers/layer_position_constraint_unittest.cc
+++ b/cc/layers/layer_position_constraint_unittest.cc
@@ -224,6 +224,7 @@
 
   // Case 2: scroll delta of 10, 10
   child_impl_->SetScrollDelta(gfx::Vector2d(10, 10));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   // Here the child is affected by scroll delta, but the fixed position
@@ -277,6 +278,7 @@
 
   // Case 1: scroll delta of 0, 0
   child_impl_->SetScrollDelta(gfx::Vector2d(0, 0));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   gfx::Transform expected_child_transform;
@@ -361,6 +363,7 @@
 
   // Case 1: scroll delta of 0, 0
   child_impl_->SetScrollDelta(gfx::Vector2d(0, 0));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   gfx::Transform expected_child_transform;
@@ -451,6 +454,7 @@
 
   // Case 2: scroll delta of 10, 30
   child_impl_->SetScrollDelta(gfx::Vector2d(10, 30));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   // Here the grand_child remains unchanged, because it scrolls along with the
@@ -562,6 +566,7 @@
 
   // Case 1: scroll delta of 0, 0
   child_impl_->SetScrollDelta(gfx::Vector2d(0, 0));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   gfx::Transform expected_child_transform;
@@ -718,6 +723,7 @@
 
   // Case 1: scroll delta of 0, 0
   child_impl_->SetScrollDelta(gfx::Vector2d(0, 0));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   gfx::Transform expected_child_transform;
@@ -899,6 +905,7 @@
 
   // Case 1: scroll delta of 0, 0
   child_impl_->SetScrollDelta(gfx::Vector2d(0, 0));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   gfx::Transform expected_child_transform;
@@ -969,6 +976,7 @@
 
   // Case 1: scrollDelta
   child_impl_->SetScrollDelta(gfx::Vector2d(10, 10));
+  child_impl_->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   // Here the child is affected by scroll delta, but the fixed position
@@ -1033,7 +1041,9 @@
   LayerImpl* fixed_to_container2 = container2->children()[0];
 
   container1->SetScrollDelta(gfx::Vector2d(0, 15));
+  container1->SetDrawsContent(true);
   container2->SetScrollDelta(gfx::Vector2d(30, 0));
+  container2->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root_impl_);
 
   gfx::Transform expected_container1_transform;
@@ -1079,6 +1089,7 @@
 
   // Case 1: fixed-container size delta of 20, 20
   scroll_layer_impl_->SetScrollDelta(gfx::Vector2d(10, 10));
+  scroll_layer_impl_->SetDrawsContent(true);
   SetFixedContainerSizeDelta(scroll_layer_impl_, gfx::Vector2d(20, 20));
   gfx::Transform expected_scroll_layer_transform;
   expected_scroll_layer_transform.Translate(-10.0, -10.0);
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index eccf3f0..898b3e35 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -897,34 +897,44 @@
       global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY ||
       global_state_.memory_limit_policy == ALLOW_NOTHING;
 
-  // Mark any required-for-activation tiles that have not been been assigned
-  // memory after reaching a steady memory state as OOM. This ensures that we
-  // activate even when OOM. Note that we can't reuse the queue we used for
-  // AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call could have
-  // evicted some tiles that would not be picked up by the old raster queue.
-  scoped_ptr<RasterTilePriorityQueue> required_for_activation_queue(
-      client_->BuildRasterQueue(
-          global_state_.tree_priority,
-          RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION));
-
   // If we have tiles left to raster for activation, and we don't allow
   // activating without them, then skip activation and return early.
-  if (!required_for_activation_queue->IsEmpty() && wait_for_all_required_tiles)
+  if (wait_for_all_required_tiles)
     return;
 
-  // Mark required tiles as OOM so that we can activate without them.
-  for (; !required_for_activation_queue->IsEmpty();
-       required_for_activation_queue->Pop()) {
-    Tile* tile = required_for_activation_queue->Top().tile();
+  // Mark any required tiles that have not been been assigned memory after
+  // reaching a steady memory state as OOM. This ensures that we activate/draw
+  // even when OOM. Note that we can't reuse the queue we used for
+  // AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call could have
+  // evicted some tiles that would not be picked up by the old raster queue.
+  bool need_to_signal_activate = MarkTilesOutOfMemory(client_->BuildRasterQueue(
+      global_state_.tree_priority,
+      RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION));
+  bool need_to_signal_draw = MarkTilesOutOfMemory(client_->BuildRasterQueue(
+      global_state_.tree_priority,
+      RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW));
+
+  DCHECK(IsReadyToActivate());
+  DCHECK(IsReadyToDraw());
+  signals_.ready_to_activate = need_to_signal_activate;
+  signals_.ready_to_draw = need_to_signal_draw;
+  // TODO(ericrk): Investigate why we need to schedule this (not just call it
+  // inline). http://crbug.com/498439
+  signals_check_notifier_.Schedule();
+}
+
+bool TileManager::MarkTilesOutOfMemory(
+    scoped_ptr<RasterTilePriorityQueue> queue) const {
+  // Mark required tiles as OOM so that we can activate/draw without them.
+  if (queue->IsEmpty())
+    return false;
+
+  for (; !queue->IsEmpty(); queue->Pop()) {
+    Tile* tile = queue->Top().tile();
     tile->draw_info().set_oom();
     client_->NotifyTileStateChanged(tile);
   }
-
-  DCHECK(IsReadyToActivate());
-  // TODO(ericrk): Investigate why we need to schedule this (not just call it
-  // inline). http://crbug.com/498439
-  signals_.ready_to_activate = true;
-  signals_check_notifier_.Schedule();
+  return true;
 }
 
 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
diff --git a/cc/tiles/tile_manager.h b/cc/tiles/tile_manager.h
index 310b934..abffc7c 100644
--- a/cc/tiles/tile_manager.h
+++ b/cc/tiles/tile_manager.h
@@ -283,6 +283,7 @@
   bool AreRequiredTilesReadyToDraw(RasterTilePriorityQueue::Type type) const;
   void CheckIfMoreTilesNeedToBePrepared();
   void CheckAndIssueSignals();
+  bool MarkTilesOutOfMemory(scoped_ptr<RasterTilePriorityQueue> queue) const;
 
   ResourceFormat DetermineResourceFormat(const Tile* tile) const;
   bool DetermineResourceRequiresSwizzle(const Tile* tile) const;
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index eb81afa..e3c50b94 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -1448,6 +1448,7 @@
   }
 }
 
+// TODO(vmpstr): Merge TileManagerTest and TileManagerTilePriorityQueueTest.
 class TileManagerTest : public testing::Test {
  public:
   TileManagerTest()
@@ -1464,6 +1465,58 @@
     host_impl_->InitializeRenderer(output_surface_.get());
   }
 
+  void SetupDefaultTrees(const gfx::Size& layer_bounds) {
+    scoped_refptr<FakeDisplayListRasterSource> pending_raster_source =
+        FakeDisplayListRasterSource::CreateFilled(layer_bounds);
+    scoped_refptr<FakeDisplayListRasterSource> active_raster_source =
+        FakeDisplayListRasterSource::CreateFilled(layer_bounds);
+
+    SetupTrees(pending_raster_source, active_raster_source);
+  }
+
+  // This matches picture_layer_impl_unittest's ActivateTree.
+  void ActivateTree() {
+    host_impl_->ActivateSyncTree();
+    CHECK(!host_impl_->pending_tree());
+    bool update_lcd_text = false;
+    host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
+  }
+
+  void SetupTrees(scoped_refptr<DisplayListRasterSource> pending_raster_source,
+                  scoped_refptr<DisplayListRasterSource> active_raster_source) {
+    SetupPendingTree(active_raster_source);
+    ActivateTree();
+    SetupPendingTree(pending_raster_source);
+  }
+
+  void SetupPendingTree(scoped_refptr<DisplayListRasterSource> raster_source) {
+    host_impl_->CreatePendingTree();
+    LayerTreeImpl* pending_tree = host_impl_->pending_tree();
+
+    // Steal from the recycled tree.
+    scoped_ptr<LayerImpl> old_pending_root = pending_tree->DetachLayerTree();
+    scoped_ptr<FakePictureLayerImpl> pending_layer;
+    if (old_pending_root) {
+      pending_layer.reset(
+          static_cast<FakePictureLayerImpl*>(old_pending_root.release()));
+      pending_layer->SetRasterSourceOnPending(raster_source, Region());
+    } else {
+      int id = 7;
+      pending_layer = FakePictureLayerImpl::CreateWithRasterSource(
+          pending_tree, id, raster_source);
+      pending_layer->SetDrawsContent(true);
+      pending_layer->SetHasRenderSurface(true);
+    }
+    // The bounds() just mirror the raster source size.
+    pending_layer->SetBounds(pending_layer->raster_source()->GetSize());
+    pending_tree->SetRootLayer(pending_layer.Pass());
+
+    // Add tilings/tiles for the layer.
+    bool update_lcd_text = false;
+    host_impl_->pending_tree()->BuildPropertyTreesForTesting();
+    host_impl_->pending_tree()->UpdateDrawProperties(update_lcd_text);
+  }
+
  protected:
   // MockLayerTreeHostImpl allows us to intercept tile manager callbacks.
   class MockLayerTreeHostImpl : public FakeLayerTreeHostImpl {
@@ -1518,6 +1571,25 @@
   }
 }
 
+TEST_F(TileManagerTest, ActivateAndDrawWhenOOM) {
+  SetupDefaultTrees(gfx::Size(1000, 1000));
+
+  auto global_state = host_impl_->global_tile_state();
+  global_state.hard_memory_limit_in_bytes = 1u;
+  global_state.soft_memory_limit_in_bytes = 1u;
+
+  base::RunLoop run_loop;
+  EXPECT_FALSE(host_impl_->tile_manager()->HasScheduledTileTasksForTesting());
+  EXPECT_CALL(*host_impl_, NotifyAllTileTasksCompleted())
+      .WillOnce(testing::Invoke([&run_loop]() { run_loop.Quit(); }));
+  host_impl_->tile_manager()->PrepareTiles(global_state);
+  EXPECT_TRUE(host_impl_->tile_manager()->HasScheduledTileTasksForTesting());
+  run_loop.Run();
+
+  EXPECT_TRUE(host_impl_->tile_manager()->IsReadyToDraw());
+  EXPECT_TRUE(host_impl_->tile_manager()->IsReadyToActivate());
+}
+
 TEST_F(TileManagerTest, LowResHasNoImage) {
   gfx::Size size(10, 12);
   TileResolution resolutions[] = {HIGH_RESOLUTION, LOW_RESOLUTION};
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 649f6c2..832f864 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -445,14 +445,22 @@
   return layer->Is3dSorted();
 }
 
-static bool IsLayerBackFaceVisible(LayerImpl* layer) {
+static bool IsLayerBackFaceVisible(LayerImpl* layer,
+                                   bool use_property_trees,
+                                   const TransformTree& transform_tree) {
   // The current W3C spec on CSS transforms says that backface visibility should
   // be determined differently depending on whether the layer is in a "3d
   // rendering context" or not. For Chromium code, we can determine whether we
   // are in a 3d rendering context by checking if the parent preserves 3d.
 
-  if (LayerIsInExisting3DRenderingContext(layer))
-    return layer->draw_transform().IsBackFaceVisible();
+  if (LayerIsInExisting3DRenderingContext(layer)) {
+    if (use_property_trees) {
+      return DrawTransformFromPropertyTrees(layer, transform_tree)
+          .IsBackFaceVisible();
+    } else {
+      return layer->draw_transform().IsBackFaceVisible();
+    }
+  }
 
   // In this case, either the layer establishes a new 3d rendering context, or
   // is not in a 3d rendering context at all.
@@ -519,7 +527,10 @@
       layer_rect_in_target_space, layer->draw_transform());
 }
 
-static bool LayerShouldBeSkipped(LayerImpl* layer, bool layer_is_drawn) {
+static bool LayerShouldBeSkipped(LayerImpl* layer,
+                                 bool layer_is_drawn,
+                                 bool use_property_trees,
+                                 const TransformTree& transform_tree) {
   // Layers can be skipped if any of these conditions are met.
   //   - is not drawn due to it or one of its ancestors being hidden (or having
   //     no copy requests).
@@ -553,7 +564,8 @@
   // The layer should not be drawn if (1) it is not double-sided and (2) the
   // back of the layer is known to be facing the screen.
   if (!backface_test_layer->double_sided() &&
-      IsLayerBackFaceVisible(backface_test_layer))
+      IsLayerBackFaceVisible(backface_test_layer, use_property_trees,
+                             transform_tree))
     return true;
 
   return false;
@@ -1764,13 +1776,16 @@
     DCHECK(layer->render_surface());
     // Check back-face visibility before continuing with this surface and its
     // subtree
+    RenderSurfaceImpl* render_surface = layer->render_surface();
     if (!layer->double_sided() &&
         IsSurfaceBackFaceVisible(layer, combined_transform)) {
+      gfx::Transform draw_transform = combined_transform;
+      draw_transform.Scale(1.0 / combined_transform_scales.x(),
+                           1.0 / combined_transform_scales.y());
+      render_surface->SetDrawTransform(draw_transform);
       return;
     }
 
-    RenderSurfaceImpl* render_surface = layer->render_surface();
-
     if (IsRootLayer(layer)) {
       // The root layer's render surface size is predetermined and so the root
       // layer can't directly support non-identity transforms.  It should just
@@ -2482,12 +2497,6 @@
 
   if (render_to_separate_surface) {
     DCHECK(layer->render_surface());
-    if (!layer->double_sided() &&
-        IsSurfaceBackFaceVisible(layer, layer->draw_transform())) {
-      layer->ClearRenderSurfaceLayerList();
-      layer->draw_properties().render_target = nullptr;
-      return;
-    }
 
     if (use_property_trees) {
       RenderSurfaceDrawProperties draw_properties;
@@ -2508,6 +2517,14 @@
       layer->render_surface()->SetClipRect(draw_properties.clip_rect);
     }
 
+    if (!layer->double_sided() &&
+        IsSurfaceBackFaceVisible(layer,
+                                 layer->render_surface()->draw_transform())) {
+      layer->ClearRenderSurfaceLayerList();
+      layer->draw_properties().render_target = nullptr;
+      return;
+    }
+
     if (IsRootLayer(layer)) {
       // The root surface does not contribute to any other surface, it has no
       // target.
@@ -2542,7 +2559,9 @@
 
   size_t descendants_size = descendants->size();
 
-  bool layer_should_be_skipped = LayerShouldBeSkipped(layer, layer_is_drawn);
+  bool layer_should_be_skipped =
+      LayerShouldBeSkipped(layer, layer_is_drawn, use_property_trees,
+                           property_trees->transform_tree);
   if (!layer_should_be_skipped) {
     MarkLayerWithRenderSurfaceLayerListId(layer,
                                           current_render_surface_layer_list_id);
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index e42460d..2df05ae 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -146,6 +146,8 @@
   LayerImpl* parent = root_layer();
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
+  child->SetDrawsContent(true);
+  grand_child->SetDrawsContent(true);
 
   gfx::Transform identity_matrix;
   SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
@@ -468,6 +470,7 @@
 
   // Child is set up so that a new render surface should be created.
   child->SetOpacity(0.5f);
+  child->SetDrawsContent(true);
 
   gfx::Transform parent_layer_transform;
   parent_layer_transform.Scale3d(1.f, 0.9f, 1.f);
@@ -662,12 +665,19 @@
 
   LayerImpl* root = root_layer();
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
+  parent->SetDrawsContent(true);
   LayerImpl* render_surface1 = AddChild<LayerImpl>(parent);
+  render_surface1->SetDrawsContent(true);
   LayerImpl* render_surface2 = AddChild<LayerImpl>(render_surface1);
+  render_surface2->SetDrawsContent(true);
   LayerImpl* child_of_root = AddChild<LayerImpl>(parent);
+  child_of_root->SetDrawsContent(true);
   LayerImpl* child_of_rs1 = AddChild<LayerImpl>(render_surface1);
+  child_of_rs1->SetDrawsContent(true);
   LayerImpl* child_of_rs2 = AddChild<LayerImpl>(render_surface2);
+  child_of_rs2->SetDrawsContent(true);
   LayerImpl* grand_child_of_root = AddChild<LayerImpl>(child_of_root);
+  grand_child_of_root->SetDrawsContent(true);
   LayerImpl* grand_child_of_rs1 = AddChild<LayerImpl>(child_of_rs1);
   grand_child_of_rs1->SetDrawsContent(true);
   LayerImpl* grand_child_of_rs2 = AddChild<LayerImpl>(child_of_rs2);
@@ -891,6 +901,7 @@
 
   LayerImpl* root = root_layer();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
+  child->SetDrawsContent(true);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   grand_child->SetDrawsContent(true);
   LayerImpl* great_grand_child = AddChild<LayerImpl>(grand_child);
@@ -1255,7 +1266,8 @@
   ASSERT_TRUE(parent->render_surface());
   EXPECT_EQ(1U, parent->render_surface()->layer_list().size());
   EXPECT_EQ(2U, render_surface_layer_list.size());
-  EXPECT_EQ(gfx::Rect(0, 0, 10, 10), parent->drawable_content_rect());
+  EXPECT_EQ(gfx::RectF(0, 0, 10, 10),
+            parent->render_surface()->DrawableContentRect());
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceForBlendMode) {
@@ -1614,9 +1626,13 @@
   const gfx::Transform identity_matrix;
   LayerImpl* root = root_layer();
   LayerImpl* parent = AddChild<LayerImpl>(root);
+  parent->SetDrawsContent(true);
   LayerImpl* child1 = AddChild<LayerImpl>(parent);
+  child1->SetDrawsContent(true);
   LayerImpl* child2 = AddChild<LayerImpl>(parent);
+  child2->SetDrawsContent(true);
   LayerImpl* grand_child = AddChild<LayerImpl>(child1);
+  grand_child->SetDrawsContent(true);
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child);
   leaf_node1->SetDrawsContent(true);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(child2);
@@ -1893,9 +1909,13 @@
   LayerImpl* parent = root_layer();
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child1 = AddChild<LayerImpl>(child);
+  grand_child1->SetDrawsContent(true);
   LayerImpl* grand_child2 = AddChild<LayerImpl>(child);
+  grand_child2->SetDrawsContent(true);
   LayerImpl* grand_child3 = AddChild<LayerImpl>(child);
+  grand_child3->SetDrawsContent(true);
   LayerImpl* grand_child4 = AddChild<LayerImpl>(child);
+  grand_child4->SetDrawsContent(true);
 
   SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(500, 500), true, false,
@@ -2207,8 +2227,15 @@
   LayerImpl* child_of_root = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child_of_root = AddChild<LayerImpl>(child_of_root);
 
+  parent->SetDrawsContent(true);
+  render_surface1->SetDrawsContent(true);
+  child_of_rs1->SetDrawsContent(true);
   grand_child_of_rs1->SetDrawsContent(true);
+  render_surface2->SetDrawsContent(true);
+  child_of_rs2->SetDrawsContent(true);
   grand_child_of_rs2->SetDrawsContent(true);
+  child_of_root->SetDrawsContent(true);
+  grand_child_of_root->SetDrawsContent(true);
 
   gfx::Transform layer_transform;
   layer_transform.Translate(1.0, 1.0);
@@ -2729,7 +2756,6 @@
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(100, 100), root->drawable_content_rect());
 
   // Layers that do not draw content should have empty visible_layer_rects.
   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_layer_rect());
@@ -2778,7 +2804,6 @@
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(100, 100), root->drawable_content_rect());
 
   // Layers that do not draw content should have empty visible content rects.
   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_layer_rect());
@@ -2861,7 +2886,6 @@
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(100, 100), root->drawable_content_rect());
 
   // Layers that do not draw content should have empty visible content rects.
   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_layer_rect());
@@ -3388,7 +3412,6 @@
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(100, 100), root->drawable_content_rect());
 
   // Layers that do not draw content should have empty visible content rects.
   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_layer_rect());
@@ -3453,7 +3476,6 @@
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(100, 100), root->drawable_content_rect());
 
   // Layers that do not draw content should have empty visible content rects.
   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_layer_rect());
@@ -3746,7 +3768,6 @@
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
 
   // Layers that do not draw content should have empty visible content rects.
   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_layer_rect());
@@ -3871,7 +3892,6 @@
   // device_scale_factor.
   EXPECT_EQ(gfx::RectF(200.f, 200.f),
             root->render_surface()->DrawableContentRect());
-  EXPECT_EQ(gfx::Rect(0, 0, 200, 200), root->drawable_content_rect());
   EXPECT_EQ(gfx::RectF(10.f, 10.f, 190.f, 190.f),
             render_surface1->render_surface()->DrawableContentRect());
 
@@ -4418,19 +4438,22 @@
   gfx::Transform identity_matrix;
 
   LayerImpl* parent = root_layer();
+  parent->SetDrawsContent(true);
   SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(100, 100), false, true,
                                true);
 
   LayerImpl* child = AddChildToRoot<LayerImpl>();
+  child->SetDrawsContent(true);
   SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
                                gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
                                true, false);
 
-  LayerImpl* child_empty = AddChildToRoot<LayerImpl>();
-  SetLayerPropertiesForTesting(child_empty, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(), false, true,
-                               false);
+  LayerImpl* child2 = AddChildToRoot<LayerImpl>();
+  child2->SetDrawsContent(true);
+  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(2.f, 2.f), gfx::Size(5, 5), false,
+                               true, false);
 
   float device_scale_factor = 2.5f;
   gfx::Size viewport_size(100, 100);
@@ -4438,7 +4461,7 @@
 
   EXPECT_IDEAL_SCALE_EQ(device_scale_factor, parent);
   EXPECT_IDEAL_SCALE_EQ(device_scale_factor, child);
-  EXPECT_IDEAL_SCALE_EQ(device_scale_factor, child_empty);
+  EXPECT_IDEAL_SCALE_EQ(device_scale_factor, child2);
 
   EXPECT_EQ(1u, render_surface_layer_list_impl()->size());
 
@@ -4463,7 +4486,7 @@
   EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_draw_rect);
   EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_screen_space_rect);
 
-  // Verify child and child_empty transforms. They should match.
+  // Verify child and child2 transforms. They should match.
   gfx::Transform expected_child_transform;
   expected_child_transform.Scale(device_scale_factor, device_scale_factor);
   expected_child_transform.Translate(child->position().x(),
@@ -4473,11 +4496,11 @@
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
                                   child->screen_space_transform());
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
-                                  child_empty->draw_transform());
+                                  child2->draw_transform());
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
-                                  child_empty->screen_space_transform());
+                                  child2->screen_space_transform());
 
-  // Verify results of transformed child and child_empty rects. They should
+  // Verify results of transformed child and child2 rects. They should
   // match.
   gfx::RectF child_bounds(gfx::SizeF(child->bounds()));
 
@@ -4486,18 +4509,18 @@
   gfx::RectF child_screen_space_rect =
       MathUtil::MapClippedRect(child->screen_space_transform(), child_bounds);
 
-  gfx::RectF child_empty_draw_rect =
-      MathUtil::MapClippedRect(child_empty->draw_transform(), child_bounds);
-  gfx::RectF child_empty_screen_space_rect = MathUtil::MapClippedRect(
-      child_empty->screen_space_transform(), child_bounds);
+  gfx::RectF child2_draw_rect =
+      MathUtil::MapClippedRect(child2->draw_transform(), child_bounds);
+  gfx::RectF child2_screen_space_rect =
+      MathUtil::MapClippedRect(child2->screen_space_transform(), child_bounds);
 
   gfx::RectF expected_child_draw_rect(child->position(),
                                       gfx::SizeF(child->bounds()));
   expected_child_draw_rect.Scale(device_scale_factor);
   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_draw_rect);
   EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_screen_space_rect);
-  EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_empty_draw_rect);
-  EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_empty_screen_space_rect);
+  EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child2_draw_rect);
+  EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child2_screen_space_rect);
 }
 
 TEST_F(LayerTreeHostCommonScalingTest, SurfaceLayerTransformsInHighDPI) {
@@ -4514,6 +4537,7 @@
                                gfx::PointF(), gfx::Size(100, 100), false, true,
                                false);
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
+  parent->SetDrawsContent(true);
   SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(100, 100), false, true,
                                false);
@@ -4604,11 +4628,13 @@
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
+  parent->SetDrawsContent(true);
   SetLayerPropertiesForTesting(parent, parent_scale_matrix, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(100, 100), false, true,
                                false);
 
   LayerImpl* child_scale = AddChild<LayerImpl>(parent);
+  child_scale->SetDrawsContent(true);
   SetLayerPropertiesForTesting(child_scale, child_scale_matrix, gfx::Point3F(),
                                gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
                                true, false);
@@ -4646,11 +4672,13 @@
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
+  parent->SetDrawsContent(true);
   SetLayerPropertiesForTesting(parent, parent_scale_matrix, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(100, 100), false, true,
                                false);
 
   LayerImpl* child_scale = AddChild<LayerImpl>(parent);
+  child_scale->SetDrawsContent(true);
   SetLayerPropertiesForTesting(child_scale, child_scale_matrix, gfx::Point3F(),
                                gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
                                true, false);
@@ -5606,6 +5634,8 @@
   LayerImpl* intervening = AddChild<LayerImpl>(render_surface1);
   LayerImpl* render_surface2 = AddChild<LayerImpl>(intervening);
   LayerImpl* clip_child = AddChild<LayerImpl>(render_surface2);
+  render_surface1->SetDrawsContent(true);
+  render_surface2->SetDrawsContent(true);
   clip_child->SetDrawsContent(true);
 
   clip_child->SetClipParent(clip_parent);
@@ -5697,6 +5727,8 @@
   LayerImpl* intervening = AddChild<LayerImpl>(render_surface1);
   LayerImpl* render_surface2 = AddChild<LayerImpl>(intervening);
   LayerImpl* clip_child = AddChild<LayerImpl>(render_surface2);
+  render_surface1->SetDrawsContent(true);
+  render_surface2->SetDrawsContent(true);
   clip_child->SetDrawsContent(true);
 
   clip_child->SetClipParent(clip_parent);
@@ -5786,6 +5818,7 @@
   LayerImpl* intervening = AddChild<LayerImpl>(clip_parent);
   LayerImpl* clip_child = AddChild<LayerImpl>(intervening);
   LayerImpl* child = AddChild<LayerImpl>(clip_child);
+  clip_child->SetDrawsContent(true);
   child->SetDrawsContent(true);
 
   clip_child->SetClipParent(clip_parent);
@@ -6056,6 +6089,7 @@
   rotation_transform.RotateAboutXAxis(180.0);
 
   render_surface->SetTransform(rotation_transform);
+  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
 
   ExecuteCalculateDrawProperties(root);
 
@@ -6067,6 +6101,48 @@
                     .size());
 }
 
+TEST_F(LayerTreeHostCommonTest, DoNotIncludeBackfaceInvisibleLayers) {
+  LayerImpl* root = root_layer();
+  LayerImpl* child = AddChild<LayerImpl>(root);
+  LayerImpl* grand_child = AddChild<LayerImpl>(child);
+  grand_child->SetDrawsContent(true);
+
+  child->SetDoubleSided(false);
+  grand_child->SetUseParentBackfaceVisibility(true);
+
+  gfx::Transform identity_transform;
+  SetLayerPropertiesForTesting(root, identity_transform, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(50, 50), false, true,
+                               true);
+  SetLayerPropertiesForTesting(child, identity_transform, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(30, 30), false, true,
+                               false);
+  SetLayerPropertiesForTesting(grand_child, identity_transform, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(20, 20), false, true,
+                               false);
+
+  ExecuteCalculateDrawProperties(root);
+
+  EXPECT_EQ(1u, render_surface_layer_list_impl()->size());
+  EXPECT_EQ(grand_child, render_surface_layer_list_impl()
+                             ->at(0)
+                             ->render_surface()
+                             ->layer_list()[0]);
+  gfx::Transform rotation_transform = identity_transform;
+  rotation_transform.RotateAboutXAxis(180.0);
+
+  child->SetTransform(rotation_transform);
+  child->layer_tree_impl()->property_trees()->needs_rebuild = true;
+
+  ExecuteCalculateDrawProperties(root);
+  EXPECT_EQ(1u, render_surface_layer_list_impl()->size());
+  EXPECT_EQ(0u, render_surface_layer_list_impl()
+                    ->at(0)
+                    ->render_surface()
+                    ->layer_list()
+                    .size());
+}
+
 TEST_F(LayerTreeHostCommonTest, ClippedByScrollParent) {
   // Checks that the simple case (being clipped by a scroll parent that would
   // have been processed before you anyhow) results in the right clips.
@@ -6638,8 +6714,11 @@
 
   LayerPositionConstraint constraint;
   constraint.set_is_fixed_position(true);
+  container->SetDrawsContent(true);
+  fixed->SetDrawsContent(true);
   fixed->SetPositionConstraint(constraint);
 
+  scroller->SetDrawsContent(true);
   scroller->SetScrollClipLayer(container->id());
 
   gfx::Transform identity_transform;
@@ -9044,7 +9123,9 @@
                                gfx::PointF(), gfx::Size(50, 50), true, false,
                                false);
   root->SetMasksToBounds(true);
+  root->SetDrawsContent(true);
   render_surface->SetMasksToBounds(true);
+  render_surface->SetDrawsContent(true);
   test_layer->SetMasksToBounds(true);
   test_layer->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
@@ -9114,10 +9195,22 @@
 
   ExecuteCalculateDrawProperties(root);
 
-  EXPECT_TRUE(std::isinf(
-      render_surface2->render_surface()->draw_transform().matrix().get(0, 0)));
-  EXPECT_TRUE(std::isinf(
-      render_surface2->render_surface()->draw_transform().matrix().get(1, 1)));
+  bool is_inf_or_nan =
+      std::isinf(
+          render_surface2->render_surface()->draw_transform().matrix().get(
+              0, 0)) ||
+      std::isnan(
+          render_surface2->render_surface()->draw_transform().matrix().get(0,
+                                                                           0));
+  EXPECT_TRUE(is_inf_or_nan);
+  is_inf_or_nan =
+      std::isinf(
+          render_surface2->render_surface()->draw_transform().matrix().get(
+              1, 1)) ||
+      std::isnan(
+          render_surface2->render_surface()->draw_transform().matrix().get(1,
+                                                                           1));
+  EXPECT_TRUE(is_inf_or_nan);
   EXPECT_EQ(gfx::RectF(),
             render_surface2->render_surface()->DrawableContentRect());
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index bb63c28..6834c220 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2487,7 +2487,6 @@
     InputHandler::ScrollInputType type) {
   TRACE_EVENT0("cc", "LayerTreeHostImpl::RootScrollBegin");
 
-  DCHECK(!CurrentlyScrollingLayer());
   ClearCurrentlyScrollingLayer();
 
   return ScrollBeginImpl(InnerViewportScrollLayer(), type);
@@ -2498,7 +2497,6 @@
     InputHandler::ScrollInputType type) {
   TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin");
 
-  DCHECK(!CurrentlyScrollingLayer());
   ClearCurrentlyScrollingLayer();
 
   gfx::PointF device_viewport_point = gfx::ScalePoint(
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 11b1450e..703cb14 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -220,7 +220,7 @@
         ":packed_resources",
       ]
       deps += [
-        "//components/startup_metric_utils",
+        "//components/startup_metric_utils/browser",
 
         # Precompiled plugins that need to get copied to the output directory.
         # On Mac, internal plugins go inside the framework, so these
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index f2a91a2..31c4d25 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -235,8 +235,8 @@
     "junit/src/org/chromium/chrome/browser/SSLClientCertificateRequestTest.java",
     "junit/src/org/chromium/chrome/browser/crash/LogcatExtractionCallableTest.java",
     "junit/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtilsTest.java",
+    "junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java",
     "junit/src/org/chromium/chrome/browser/gcore/GoogleApiClientConnectionHelperTest.java",
-
     "junit/src/org/chromium/chrome/browser/invalidations/InvalidationControllerTest.java",
     "junit/src/org/chromium/chrome/browser/media/remote/AbstractMediaRouteControllerTest.java",
     "junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java",
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 0e29e6a5..b90bd68b 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -641,7 +641,12 @@
         </service>
 
 
-        <receiver android:name="org.chromium.chrome.browser.media.ui.MediaButtonReceiver">
+        <receiver android:name="org.chromium.chrome.browser.media.ui.MediaNotificationManager$PlaybackMediaButtonReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.MEDIA_BUTTON" />
+            </intent-filter>
+        </receiver>
+        <receiver android:name="org.chromium.chrome.browser.media.ui.MediaNotificationManager$PresentationMediaButtonReceiver">
             <intent-filter>
                 <action android:name="android.intent.action.MEDIA_BUTTON" />
             </intent-filter>
diff --git a/chrome/android/java/res/layout/data_use_dialog.xml b/chrome/android/java/res/layout/data_use_dialog.xml
new file mode 100644
index 0000000..cfc6e17ec
--- /dev/null
+++ b/chrome/android/java/res/layout/data_use_dialog.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="wrap_content"
+    android:layout_width="match_parent"
+    android:paddingStart="18dp"
+    android:paddingTop="8dp" >
+
+    <CheckBox
+        android:id="@+id/data_use_checkbox"
+        android:layout_height="wrap_content"
+        android:layout_width="match_parent" 
+        android:text="@string/data_use_tracking_ended_checkbox_message" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java
index 944575f..1af86997 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java
@@ -15,6 +15,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
 import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler;
 
@@ -44,6 +45,11 @@
     private static boolean sGCMEnabled = true;
 
     /**
+     * Disables automatic reporting of GCM success / failure statistics.
+     */
+    private static boolean sReportingDisabledForTests = false;
+
+    /**
      * Create a BackgroundSyncLauncher object, which is owned by C++.
      * @param context The app context.
      */
@@ -140,8 +146,13 @@
         // Check to see if Play Services is up to date, and disable GCM if not.
         // This will not automatically set {@link sGCMEnabled} to true, in case it has been disabled
         // in tests.
-        if (sGCMEnabled && !canUseGooglePlayServices(context)) {
-            setGCMEnabled(false);
+        if (sGCMEnabled) {
+            if (!canUseGooglePlayServices(context)) {
+                setGCMEnabled(false);
+                recordBooleanHistogram("BackgroundSync.LaunchTask.PlayServicesAvailable", false);
+            } else {
+                recordBooleanHistogram("BackgroundSync.LaunchTask.PlayServicesAvailable", true);
+            }
         }
         mScheduler = GcmNetworkManager.getInstance(context);
         launchBrowserWhenNextOnlineIfStopped(context, false);
@@ -164,11 +175,30 @@
                                     .setPersisted(true)
                                     .setUpdateCurrent(true)
                                     .build();
-        scheduler.schedule(oneoff);
+        try {
+            scheduler.schedule(oneoff);
+            recordBooleanHistogram("BackgroundSync.LaunchTask.ScheduleSuccess", true);
+        } catch (IllegalArgumentException e) {
+            // Log the occurrence so that we can keep track of how often this is happening, and
+            // disable GCM for the remainder of this session.
+            setGCMEnabled(false);
+            recordBooleanHistogram("BackgroundSync.LaunchTask.ScheduleSuccess", false);
+        }
     }
 
     private static void removeScheduledTasks(GcmNetworkManager scheduler) {
-        scheduler.cancelAllTasks(BackgroundSyncLauncherService.class);
+        try {
+            scheduler.cancelAllTasks(BackgroundSyncLauncherService.class);
+            recordBooleanHistogram("BackgroundSync.LaunchTask.CancelSuccess", true);
+        } catch (IllegalArgumentException e) {
+            // This occurs when BackgroundSyncLauncherService is not found in the application
+            // manifest. This should not happen in code that reaches here, but has been seen in
+            // the past. See https://crbug.com/548314
+            // Log the occurrence so that we can keep track of how often this is happening, and
+            // disable GCM for the remainder of this session.
+            setGCMEnabled(false);
+            recordBooleanHistogram("BackgroundSync.LaunchTask.CancelSuccess", false);
+        }
     }
 
     /**
@@ -198,4 +228,15 @@
     static void setGCMEnabled(boolean enabled) {
         sGCMEnabled = enabled;
     }
+
+    @VisibleForTesting
+    static void setReportingDisabledForTests(boolean disabled) {
+        sReportingDisabledForTests = disabled;
+    }
+
+    private static void recordBooleanHistogram(String name, boolean value) {
+        if (!sReportingDisabledForTests) {
+            RecordHistogram.recordBooleanHistogram(name, value);
+        }
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index db8abd8..93c38ad 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -58,7 +58,6 @@
 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
 import org.chromium.chrome.browser.appmenu.AppMenuObserver;
 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
-import org.chromium.chrome.browser.appmenu.ChromeAppMenuPropertiesDelegate;
 import org.chromium.chrome.browser.bookmark.ManageBookmarkActivity;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
@@ -151,8 +150,8 @@
         /**
          * @return AppMenuHandler for the given activity and menu resource id.
          */
-        public AppMenuHandler get(Activity activity,
-                AppMenuPropertiesDelegate delegate, int menuResourceId);
+        public AppMenuHandler get(Activity activity, AppMenuPropertiesDelegate delegate,
+                int menuResourceId);
     }
 
     /**
@@ -207,7 +206,7 @@
     private SnackbarManager mSnackbarManager;
     private LoFiBarPopupController mLoFiBarPopupController;
     private DataUseSnackbarController mDataUseSnackbarController;
-    private ChromeAppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
+    private AppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
     private AppMenuHandler mAppMenuHandler;
     private ToolbarManager mToolbarManager;
     private BookmarkModelObserver mBookmarkObserver;
@@ -385,11 +384,11 @@
     }
 
     /**
-     * @return {@link ChromeAppMenuPropertiesDelegate} instance that the {@link AppMenuHandler}
+     * @return {@link AppMenuPropertiesDelegate} instance that the {@link AppMenuHandler}
      *         should be using in this activity.
      */
-    protected ChromeAppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
-        return new ChromeAppMenuPropertiesDelegate(this);
+    protected AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
+        return new AppMenuPropertiesDelegate(this);
     }
 
     /**
@@ -459,11 +458,11 @@
         mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(tabModelSelector) {
             @Override
             public void onPageLoadStarted(Tab tab, String url) {
-                if (DataUseTabUIManager.hasDataUseTrackingStarted(tab)) {
+                if (DataUseTabUIManager.checkDataUseTrackingStarted(tab)) {
                     mDataUseSnackbarController.showDataUseTrackingStartedBar();
-                }
-
-                if (DataUseTabUIManager.hasDataUseTrackingEnded(tab)) {
+                } else if (DataUseTabUIManager.checkDataUseTrackingEnded(tab)
+                        && DataUseTabUIManager
+                                .getOptedOutOfDataUseDialog(getApplicationContext())) {
                     mDataUseSnackbarController.showDataUseTrackingEndedBar();
                 }
             }
@@ -1344,7 +1343,7 @@
      * @return The {@link AppMenuPropertiesDelegate} associated with this activity.
      */
     @VisibleForTesting
-    public ChromeAppMenuPropertiesDelegate getAppMenuPropertiesDelegate() {
+    public AppMenuPropertiesDelegate getAppMenuPropertiesDelegate() {
         return mAppMenuPropertiesDelegate;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
index 3f71abf3..a7eeb672 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
@@ -1,29 +1,250 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 package org.chromium.chrome.browser.appmenu;
 
+import android.text.TextUtils;
 import android.view.Menu;
+import android.view.MenuItem;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.BookmarksBridge;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeBrowserProviderClient;
+import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.share.ShareHelper;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.util.FeatureUtilities;
+import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
+import org.chromium.printing.PrintingController;
 
 /**
- * Interface for the App Handler to query the desired state of the App Menu.
+ * App Menu helper that handles hiding and showing menu items based on activity state.
  */
-public interface AppMenuPropertiesDelegate {
+public class AppMenuPropertiesDelegate {
+    // Indices for different levels in drawable.btn_reload_stop.
+    // Used only when preparing menu and refresh reload button in menu when tab
+    // page load status changes.
+    private static final int RELOAD_BUTTON_LEVEL_RELOAD = 0;
+    private static final int RELOAD_BUTTON_LEVEL_STOP_LOADING = 1;
+
+    protected MenuItem mReloadMenuItem;
+
+    protected final ChromeActivity mActivity;
+
+    protected BookmarksBridge mBookmarksBridge;
+
+    public AppMenuPropertiesDelegate(ChromeActivity activity) {
+        mActivity = activity;
+    }
 
     /**
      * @return Whether the App Menu should be shown.
      */
-    boolean shouldShowAppMenu();
+    public boolean shouldShowAppMenu() {
+        return mActivity.shouldShowAppMenu();
+    }
+
+    /**
+     * Allows the delegate to show and hide items before the App Menu is shown. It is called every
+     * time the menu is shown. This assumes that the provided menu contains all the items expected
+     * in the application menu (i.e. that the main menu has been inflated into it).
+     * @param menu Menu that will be used as the source for the App Menu pop up.
+     */
+    public void prepareMenu(Menu menu) {
+        // Exactly one of these will be true, depending on the type of menu showing.
+        boolean isPageMenu;
+        boolean isOverviewMenu;
+        boolean isTabletEmptyModeMenu;
+
+        boolean isOverview = mActivity.isInOverviewMode();
+        boolean isIncognito = mActivity.getCurrentTabModel().isIncognito();
+        Tab currentTab = mActivity.getActivityTab();
+
+        // Determine which menu to show.
+        if (mActivity.isTablet()) {
+            isPageMenu = !isOverview && mActivity.getCurrentTabModel().getCount() != 0;
+            isOverviewMenu = isOverview && mActivity.getCurrentTabModel().getCount() != 0;
+            isTabletEmptyModeMenu = !isPageMenu && mActivity.getCurrentTabModel().getCount() == 0;
+        } else {
+            isPageMenu = !isOverview;
+            isOverviewMenu = isOverview;
+            isTabletEmptyModeMenu = false;
+        }
+
+        menu.setGroupVisible(R.id.PAGE_MENU, isPageMenu);
+        menu.setGroupVisible(R.id.OVERVIEW_MODE_MENU, isOverviewMenu);
+        menu.setGroupVisible(R.id.TABLET_EMPTY_MODE_MENU, isTabletEmptyModeMenu);
+
+        if (isPageMenu && currentTab != null) {
+            String url = currentTab.getUrl();
+            boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_SCHEME)
+                    || url.startsWith(UrlConstants.CHROME_NATIVE_SCHEME);
+
+            // Update the icon row items (not shown on tablet).
+            menu.findItem(R.id.icon_row_menu_id).setVisible(!mActivity.isTablet());
+            if (!mActivity.isTablet()) {
+                // Disable the "Forward" menu item if there is no page to go to.
+                MenuItem forwardMenuItem = menu.findItem(R.id.forward_menu_id);
+                forwardMenuItem.setEnabled(currentTab.canGoForward());
+
+                mReloadMenuItem = menu.findItem(R.id.reload_menu_id);
+                mReloadMenuItem.setIcon(R.drawable.btn_reload_stop);
+                loadingStateChanged(currentTab.isLoading());
+
+                MenuItem bookmarkMenuItem = menu.findItem(R.id.bookmark_this_page_id);
+                bookmarkMenuItem.setEnabled(mBookmarksBridge.isEditBookmarksEnabled());
+                if (currentTab.getBookmarkId() != ChromeBrowserProviderClient.INVALID_BOOKMARK_ID) {
+                    bookmarkMenuItem.setIcon(R.drawable.btn_star_filled);
+                    bookmarkMenuItem.setChecked(true);
+                    bookmarkMenuItem.setTitleCondensed(mActivity.getString(R.string.edit_bookmark));
+                } else {
+                    bookmarkMenuItem.setIcon(R.drawable.btn_star);
+                    bookmarkMenuItem.setChecked(false);
+                    bookmarkMenuItem.setTitleCondensed(null);
+                }
+            }
+
+            // Hide "Recent tabs" in incognito mode or when sync can't be enabled.
+            MenuItem recentTabsMenuItem = menu.findItem(R.id.recent_tabs_menu_id);
+            recentTabsMenuItem.setVisible(!isIncognito && FeatureUtilities.canAllowSync(mActivity));
+            recentTabsMenuItem.setTitle(R.string.menu_recent_tabs);
+
+            if (OfflinePageBridge.isEnabled()) {
+                MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id);
+                allBookmarksMenuItem.setTitle(mActivity.getString(
+                        R.string.menu_bookmarks_offline_pages));
+            }
+
+            // Don't allow "chrome://" pages to be shared.
+            menu.findItem(R.id.share_row_menu_id).setVisible(!isChromeScheme);
+
+            ShareHelper.configureDirectShareMenuItem(
+                    mActivity, menu.findItem(R.id.direct_share_menu_id));
+
+            // Disable find in page on the native NTP.
+            menu.findItem(R.id.find_in_page_id).setVisible(
+                    !currentTab.isNativePage() && currentTab.getWebContents() != null);
+
+            // Hide 'Add to homescreen' on all chrome:// pages -- Android doesn't know how to direct
+            // those URLs.  Also hide it on incognito pages to avoid problems where users create
+            // shortcuts in incognito mode and then open the webapp in regular mode. Also check if
+            // creating shortcuts is supported at all.
+            MenuItem homescreenItem = menu.findItem(R.id.add_to_homescreen_id);
+            boolean canAddShortcutToHomescreen =
+                    ShortcutHelper.isAddToHomeIntentSupported(mActivity);
+            homescreenItem.setVisible(
+                    canAddShortcutToHomescreen && !isChromeScheme && !isIncognito);
+
+            // Hide request desktop site on all chrome:// pages except for the NTP. Check request
+            // desktop site if it's activated on this page.
+            MenuItem requestItem = menu.findItem(R.id.request_desktop_site_id);
+            requestItem.setVisible(!isChromeScheme || currentTab.isNativePage());
+            requestItem.setChecked(currentTab.getUseDesktopUserAgent());
+            requestItem.setTitleCondensed(requestItem.isChecked()
+                    ? mActivity.getString(R.string.menu_request_desktop_site_on)
+                    : mActivity.getString(R.string.menu_request_desktop_site_off));
+
+            PrintingController printingController =
+                    mActivity.getChromeApplication().getPrintingController();
+            disableEnableMenuItem(menu, R.id.print_id,
+                    printingController != null && !currentTab.isNativePage(),
+                    printingController != null && !printingController.isBusy()
+                            && PrefServiceBridge.getInstance().isPrintingEnabled(),
+                    PrefServiceBridge.getInstance().isPrintingManaged());
+
+            // Only display reader mode settings menu option if the current page is in reader mode.
+            menu.findItem(R.id.reader_mode_prefs_id)
+                    .setVisible(DomDistillerUrlUtils.isDistilledPage(currentTab.getUrl()));
+        }
+
+        if (isOverviewMenu) {
+            if (isIncognito) {
+                // Hide normal close all tabs item.
+                menu.findItem(R.id.close_all_tabs_menu_id).setVisible(false);
+                // Enable close incognito tabs only if there are incognito tabs.
+                menu.findItem(R.id.close_all_incognito_tabs_menu_id).setEnabled(true);
+            } else {
+                // Hide close incognito tabs item.
+                menu.findItem(R.id.close_all_incognito_tabs_menu_id).setVisible(false);
+                // Enable close all tabs if there are normal tabs or incognito tabs.
+                menu.findItem(R.id.close_all_tabs_menu_id).setEnabled(
+                        mActivity.getTabModelSelector().getTotalTabCount() > 0);
+            }
+        }
+
+        // Incognito NTP in Document mode should not show "New incognito tab" menu item.
+        boolean incognitoItemVisible = !FeatureUtilities.isDocumentMode(mActivity)
+                || (currentTab == null)
+                || !(TextUtils.equals(currentTab.getUrl(), UrlConstants.NTP_URL) && isIncognito);
+
+        // Disable new incognito tab when it is blocked (e.g. by a policy).
+        // findItem(...).setEnabled(...)" is not enough here, because of the inflated
+        // main_menu.xml contains multiple items with the same id in different groups
+        // e.g.: new_incognito_tab_menu_id.
+        disableEnableMenuItem(menu, R.id.new_incognito_tab_menu_id,
+                incognitoItemVisible,
+                PrefServiceBridge.getInstance().isIncognitoModeEnabled(),
+                PrefServiceBridge.getInstance().isIncognitoModeManaged());
+        mActivity.prepareMenu(menu);
+    }
+
+    /**
+     * Notify the delegate that the load state changed.
+     * @param isLoading Whether the page is currently loading.
+     */
+    public void loadingStateChanged(boolean isLoading) {
+        if (mReloadMenuItem != null) {
+            mReloadMenuItem.getIcon().setLevel(isLoading
+                    ? RELOAD_BUTTON_LEVEL_STOP_LOADING : RELOAD_BUTTON_LEVEL_RELOAD);
+            mReloadMenuItem.setTitle(isLoading
+                    ? R.string.accessibility_btn_stop_loading : R.string.accessibility_btn_refresh);
+        }
+    }
+
+    /**
+     * Notify the delegate that menu was dismissed.
+     */
+    public void onMenuDismissed() {
+        mReloadMenuItem = null;
+    }
+
+    // Set enabled to be |enable| for all MenuItems with |id| in |menu|.
+    // If |managed| is true then the "Managed By Enterprise" icon is shown next to the menu.
+    private void disableEnableMenuItem(
+            Menu menu, int id, boolean visible, boolean enabled, boolean managed) {
+        for (int i = 0; i < menu.size(); ++i) {
+            MenuItem item = menu.getItem(i);
+            if (item.getItemId() == id && item.isVisible()) {
+                item.setVisible(visible);
+                item.setEnabled(enabled);
+                if (managed) {
+                    item.setIcon(ManagedPreferencesUtils.getManagedByEnterpriseIconId());
+                } else {
+                    item.setIcon(null);
+                }
+            }
+        }
+    }
 
     /**
      * @return Resource layout id for the footer if there should be one. O otherwise.
      */
-    int getFooterResourceId();
+    public int getFooterResourceId() {
+        return 0;
+    }
 
     /**
-     * Allows the delegate to show and hide items before the App Menu is shown.
-     * @param mMenu Menu that will be used as the source for the App Menu pop up.
+     * Updates the bookmarks bridge.
+     *
+     * @param bookmarksBridge The bookmarks bridge.
      */
-    void prepareMenu(Menu mMenu);
+    public void setBookmarksBridge(BookmarksBridge bookmarksBridge) {
+        mBookmarksBridge = bookmarksBridge;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/ChromeAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/ChromeAppMenuPropertiesDelegate.java
deleted file mode 100644
index 2f3725a..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/ChromeAppMenuPropertiesDelegate.java
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.appmenu;
-
-import android.text.TextUtils;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.BookmarksBridge;
-import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeBrowserProviderClient;
-import org.chromium.chrome.browser.ShortcutHelper;
-import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
-import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.share.ShareHelper;
-import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.util.FeatureUtilities;
-import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
-import org.chromium.printing.PrintingController;
-
-/**
- * App Menu helper that handles hiding and showing menu items based on activity state.
- */
-public class ChromeAppMenuPropertiesDelegate implements AppMenuPropertiesDelegate {
-    // Indices for different levels in drawable.btn_reload_stop.
-    // Used only when preparing menu and refresh reload button in menu when tab
-    // page load status changes.
-    private static final int RELOAD_BUTTON_LEVEL_RELOAD = 0;
-    private static final int RELOAD_BUTTON_LEVEL_STOP_LOADING = 1;
-
-    protected MenuItem mReloadMenuItem;
-
-    protected final ChromeActivity mActivity;
-
-    protected BookmarksBridge mBookmarksBridge;
-
-    public ChromeAppMenuPropertiesDelegate(ChromeActivity activity) {
-        mActivity = activity;
-    }
-
-    @Override
-    public boolean shouldShowAppMenu() {
-        return mActivity.shouldShowAppMenu();
-    }
-
-    /**
-     * Called every time the menu is shown. This assumes that the provided menu contains all the
-     * items expected in the application menu (i.e. that the main menu has been inflated into it).
-     */
-    @Override
-    public void prepareMenu(Menu menu) {
-        // Exactly one of these will be true, depending on the type of menu showing.
-        boolean isPageMenu;
-        boolean isOverviewMenu;
-        boolean isTabletEmptyModeMenu;
-
-        boolean isOverview = mActivity.isInOverviewMode();
-        boolean isIncognito = mActivity.getCurrentTabModel().isIncognito();
-        Tab currentTab = mActivity.getActivityTab();
-
-        // Determine which menu to show.
-        if (mActivity.isTablet()) {
-            isPageMenu = !isOverview && mActivity.getCurrentTabModel().getCount() != 0;
-            isOverviewMenu = isOverview && mActivity.getCurrentTabModel().getCount() != 0;
-            isTabletEmptyModeMenu = !isPageMenu && mActivity.getCurrentTabModel().getCount() == 0;
-        } else {
-            isPageMenu = !isOverview;
-            isOverviewMenu = isOverview;
-            isTabletEmptyModeMenu = false;
-        }
-
-        menu.setGroupVisible(R.id.PAGE_MENU, isPageMenu);
-        menu.setGroupVisible(R.id.OVERVIEW_MODE_MENU, isOverviewMenu);
-        menu.setGroupVisible(R.id.TABLET_EMPTY_MODE_MENU, isTabletEmptyModeMenu);
-
-        if (isPageMenu && currentTab != null) {
-            String url = currentTab.getUrl();
-            boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_SCHEME)
-                    || url.startsWith(UrlConstants.CHROME_NATIVE_SCHEME);
-
-            // Update the icon row items (not shown on tablet).
-            menu.findItem(R.id.icon_row_menu_id).setVisible(!mActivity.isTablet());
-            if (!mActivity.isTablet()) {
-                // Disable the "Forward" menu item if there is no page to go to.
-                MenuItem forwardMenuItem = menu.findItem(R.id.forward_menu_id);
-                forwardMenuItem.setEnabled(currentTab.canGoForward());
-
-                mReloadMenuItem = menu.findItem(R.id.reload_menu_id);
-                mReloadMenuItem.setIcon(R.drawable.btn_reload_stop);
-                loadingStateChanged(currentTab.isLoading());
-
-                MenuItem bookmarkMenuItem = menu.findItem(R.id.bookmark_this_page_id);
-                bookmarkMenuItem.setEnabled(mBookmarksBridge.isEditBookmarksEnabled());
-                if (currentTab.getBookmarkId() != ChromeBrowserProviderClient.INVALID_BOOKMARK_ID) {
-                    bookmarkMenuItem.setIcon(R.drawable.btn_star_filled);
-                    bookmarkMenuItem.setChecked(true);
-                    bookmarkMenuItem.setTitleCondensed(mActivity.getString(R.string.edit_bookmark));
-                } else {
-                    bookmarkMenuItem.setIcon(R.drawable.btn_star);
-                    bookmarkMenuItem.setChecked(false);
-                    bookmarkMenuItem.setTitleCondensed(null);
-                }
-            }
-
-            // Hide "Recent tabs" in incognito mode or when sync can't be enabled.
-            MenuItem recentTabsMenuItem = menu.findItem(R.id.recent_tabs_menu_id);
-            recentTabsMenuItem.setVisible(!isIncognito && FeatureUtilities.canAllowSync(mActivity));
-            recentTabsMenuItem.setTitle(R.string.menu_recent_tabs);
-
-            if (OfflinePageBridge.isEnabled()) {
-                MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id);
-                allBookmarksMenuItem.setTitle(mActivity.getString(
-                        R.string.menu_bookmarks_offline_pages));
-            }
-
-            // Don't allow "chrome://" pages to be shared.
-            menu.findItem(R.id.share_row_menu_id).setVisible(!isChromeScheme);
-
-            ShareHelper.configureDirectShareMenuItem(
-                    mActivity, menu.findItem(R.id.direct_share_menu_id));
-
-            // Disable find in page on the native NTP.
-            menu.findItem(R.id.find_in_page_id).setVisible(
-                    !currentTab.isNativePage() && currentTab.getWebContents() != null);
-
-            // Hide 'Add to homescreen' on all chrome:// pages -- Android doesn't know how to direct
-            // those URLs.  Also hide it on incognito pages to avoid problems where users create
-            // shortcuts in incognito mode and then open the webapp in regular mode. Also check if
-            // creating shortcuts is supported at all.
-            MenuItem homescreenItem = menu.findItem(R.id.add_to_homescreen_id);
-            boolean canAddShortcutToHomescreen =
-                    ShortcutHelper.isAddToHomeIntentSupported(mActivity);
-            homescreenItem.setVisible(
-                    canAddShortcutToHomescreen && !isChromeScheme && !isIncognito);
-
-            // Hide request desktop site on all chrome:// pages except for the NTP. Check request
-            // desktop site if it's activated on this page.
-            MenuItem requestItem = menu.findItem(R.id.request_desktop_site_id);
-            requestItem.setVisible(!isChromeScheme || currentTab.isNativePage());
-            requestItem.setChecked(currentTab.getUseDesktopUserAgent());
-            requestItem.setTitleCondensed(requestItem.isChecked()
-                    ? mActivity.getString(R.string.menu_request_desktop_site_on)
-                    : mActivity.getString(R.string.menu_request_desktop_site_off));
-
-            PrintingController printingController =
-                    mActivity.getChromeApplication().getPrintingController();
-            disableEnableMenuItem(menu, R.id.print_id,
-                    printingController != null && !currentTab.isNativePage(),
-                    printingController != null && !printingController.isBusy()
-                            && PrefServiceBridge.getInstance().isPrintingEnabled(),
-                    PrefServiceBridge.getInstance().isPrintingManaged());
-
-            // Only display reader mode settings menu option if the current page is in reader mode.
-            menu.findItem(R.id.reader_mode_prefs_id)
-                    .setVisible(DomDistillerUrlUtils.isDistilledPage(currentTab.getUrl()));
-        }
-
-        if (isOverviewMenu) {
-            if (isIncognito) {
-                // Hide normal close all tabs item.
-                menu.findItem(R.id.close_all_tabs_menu_id).setVisible(false);
-                // Enable close incognito tabs only if there are incognito tabs.
-                menu.findItem(R.id.close_all_incognito_tabs_menu_id).setEnabled(true);
-            } else {
-                // Hide close incognito tabs item.
-                menu.findItem(R.id.close_all_incognito_tabs_menu_id).setVisible(false);
-                // Enable close all tabs if there are normal tabs or incognito tabs.
-                menu.findItem(R.id.close_all_tabs_menu_id).setEnabled(
-                        mActivity.getTabModelSelector().getTotalTabCount() > 0);
-            }
-        }
-
-        // Incognito NTP in Document mode should not show "New incognito tab" menu item.
-        boolean incognitoItemVisible = !FeatureUtilities.isDocumentMode(mActivity)
-                || (currentTab == null)
-                || !(TextUtils.equals(currentTab.getUrl(), UrlConstants.NTP_URL) && isIncognito);
-
-        // Disable new incognito tab when it is blocked (e.g. by a policy).
-        // findItem(...).setEnabled(...)" is not enough here, because of the inflated
-        // main_menu.xml contains multiple items with the same id in different groups
-        // e.g.: new_incognito_tab_menu_id.
-        disableEnableMenuItem(menu, R.id.new_incognito_tab_menu_id,
-                incognitoItemVisible,
-                PrefServiceBridge.getInstance().isIncognitoModeEnabled(),
-                PrefServiceBridge.getInstance().isIncognitoModeManaged());
-        mActivity.prepareMenu(menu);
-    }
-
-    /**
-     * Notify the delegate that the load state changed.
-     * @param isLoading Whether the page is currently loading.
-     */
-    public void loadingStateChanged(boolean isLoading) {
-        if (mReloadMenuItem != null) {
-            mReloadMenuItem.getIcon().setLevel(isLoading
-                    ? RELOAD_BUTTON_LEVEL_STOP_LOADING : RELOAD_BUTTON_LEVEL_RELOAD);
-            mReloadMenuItem.setTitle(isLoading
-                    ? R.string.accessibility_btn_stop_loading : R.string.accessibility_btn_refresh);
-        }
-    }
-
-    /**
-     * Notify the delegate that menu was dismissed.
-     */
-    public void onMenuDismissed() {
-        mReloadMenuItem = null;
-    }
-
-    // Set enabled to be |enable| for all MenuItems with |id| in |menu|.
-    // If |managed| is true then the "Managed By Enterprise" icon is shown next to the menu.
-    private void disableEnableMenuItem(
-            Menu menu, int id, boolean visible, boolean enabled, boolean managed) {
-        for (int i = 0; i < menu.size(); ++i) {
-            MenuItem item = menu.getItem(i);
-            if (item.getItemId() == id && item.isVisible()) {
-                item.setVisible(visible);
-                item.setEnabled(enabled);
-                if (managed) {
-                    item.setIcon(ManagedPreferencesUtils.getManagedByEnterpriseIconId());
-                } else {
-                    item.setIcon(null);
-                }
-            }
-        }
-    }
-
-    @Override
-    public int getFooterResourceId() {
-        return 0;
-    }
-
-    /**
-     * Updates the bookmarks bridge.
-     *
-     * @param bookmarksBridge The bookmarks bridge.
-     */
-    public void setBookmarksBridge(BookmarksBridge bookmarksBridge) {
-        mBookmarksBridge = bookmarksBridge;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
index 210cf45..0e5c2d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -25,11 +25,6 @@
 
     static final String PROMO_ON_LIMITED_TAPS = "promo_on_limited_taps";
     static final String TAP_TRIGGERED_PROMO_LIMIT = "tap_triggered_promo_limit";
-    static final String TAP_RESOLVE_LIMIT_FOR_DECIDED = "tap_resolve_limit_for_decided";
-    static final String TAP_PREFETCH_LIMIT_FOR_DECIDED = "tap_prefetch_limit_for_decided";
-    static final String TAP_RESOLVE_LIMIT_FOR_UNDECIDED = "tap_resolve_limit_for_undecided";
-    static final String TAP_PREFETCH_LIMIT_FOR_UNDECIDED = "tap_prefetch_limit_for_undecided";
-
     static final String PEEK_PROMO_FORCED = "peek_promo_forced";
     static final String PEEK_PROMO_ENABLED = "peek_promo_enabled";
     static final String PEEK_PROMO_MAX_SHOW_COUNT = "peek_promo_max_show_count";
@@ -43,10 +38,6 @@
 
     // Tap handling.
     private static final int UNLIMITED_TAPS = -1;
-    private static final int DEFAULT_TAP_RESOLVE_LIMIT_FOR_DECIDED = UNLIMITED_TAPS;
-    private static final int DEFAULT_TAP_PREFETCH_LIMIT_FOR_DECIDED = UNLIMITED_TAPS;
-    private static final int DEFAULT_TAP_RESOLVE_LIMIT_FOR_UNDECIDED = 100;
-    private static final int DEFAULT_TAP_PREFETCH_LIMIT_FOR_UNDECIDED = 10;
 
     // Cached values to avoid repeated and redundant JNI operations.
     private static Boolean sEnabled;
@@ -121,71 +112,6 @@
     }
 
     /**
-     * @return Whether Search Term Resolution in response to a Tap gesture is limited for decided
-     *         users.
-     */
-    static boolean isTapResolveLimitedForDecided() {
-        return getTapResolveLimitForDecided() != ContextualSearchFieldTrial.UNLIMITED_TAPS;
-    }
-
-    /**
-     * @return Whether prefetch in response to a Tap gesture is limited for decided users.
-     */
-    static boolean isTapPrefetchLimitedForDecided() {
-        return getTapPrefetchLimitForDecided() != ContextualSearchFieldTrial.UNLIMITED_TAPS;
-    }
-
-    /**
-     * @return Whether Search Term Resolution in response to a Tap gesture is limited for undecided
-     *         users.
-     */
-    static boolean isTapResolveLimitedForUndecided() {
-        return getTapResolveLimitForUndecided() != ContextualSearchFieldTrial.UNLIMITED_TAPS;
-    }
-
-    /**
-     * @return Whether prefetch in response to a Tap gesture is limited for undecided users.
-     */
-    static boolean isTapPrefetchLimitedForUndecided() {
-        return getTapPrefetchLimitForUndecided() != ContextualSearchFieldTrial.UNLIMITED_TAPS;
-    }
-    /**
-     * @return The limit on the number of taps to resolve for decided users, or the default if no
-     *         value is present in the Finch configuration.
-     */
-    static int getTapResolveLimitForDecided() {
-        return getIntParamValueOrDefault(TAP_RESOLVE_LIMIT_FOR_DECIDED,
-                DEFAULT_TAP_RESOLVE_LIMIT_FOR_DECIDED);
-    }
-
-    /**
-     * @return The limit on the number of prefetches to issue for decided users, or the default
-     *         if no value is present.
-     */
-    static int getTapPrefetchLimitForDecided() {
-        return getIntParamValueOrDefault(TAP_PREFETCH_LIMIT_FOR_DECIDED,
-                DEFAULT_TAP_PREFETCH_LIMIT_FOR_DECIDED);
-    }
-
-    /**
-     * @return The limit on the number of taps to resolve for undecided users, or the default if no
-     *         value is present in the Finch configuration.
-     */
-    static int getTapResolveLimitForUndecided() {
-        return getIntParamValueOrDefault(TAP_RESOLVE_LIMIT_FOR_UNDECIDED,
-                DEFAULT_TAP_RESOLVE_LIMIT_FOR_UNDECIDED);
-    }
-
-    /**
-     * @return The limit on the number of prefetches to issue for undecided users, or the default
-     *         if no value is present.
-     */
-    static int getTapPrefetchLimitForUndecided() {
-        return getIntParamValueOrDefault(TAP_PREFETCH_LIMIT_FOR_UNDECIDED,
-                DEFAULT_TAP_PREFETCH_LIMIT_FOR_UNDECIDED);
-    }
-
-    /**
      * @return Whether the Peek Promo is forcibly enabled (used for testing).
      */
     static boolean isPeekPromoForced() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
index 7485710..db237a37 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -30,6 +30,10 @@
     private static final Pattern CONTAINS_WHITESPACE_PATTERN = Pattern.compile("\\s");
     private static final int REMAINING_NOT_APPLICABLE = -1;
     private static final int ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000;
+    private static final int TAP_RESOLVE_LIMIT_FOR_DECIDED = 50;
+    private static final int TAP_PREFETCH_LIMIT_FOR_DECIDED = 50;
+    private static final int TAP_RESOLVE_LIMIT_FOR_UNDECIDED = 20;
+    private static final int TAP_PREFETCH_LIMIT_FOR_UNDECIDED = 20;
 
     private static ContextualSearchPolicy sInstance;
 
@@ -39,6 +43,10 @@
     private boolean mDidOverrideDecidedStateForTesting;
     private boolean mDecidedStateForTesting;
     private boolean mDidResetCounters;
+    private Integer mTapResolveLimitForDecided;
+    private Integer mTapPrefetchLimitForDecided;
+    private Integer mTapResolveLimitForUndecided;
+    private Integer mTapPrefetchLimitForUndecided;
 
     public static ContextualSearchPolicy getInstance(Context context) {
         if (sInstance == null) {
@@ -429,6 +437,26 @@
         return ContextualSearchFieldTrial.isTranslationOneboxEnabled();
     }
 
+    @VisibleForTesting
+    void setTapResolveLimitForDecidedForTesting(int limit) {
+        mTapResolveLimitForDecided = limit;
+    }
+
+    @VisibleForTesting
+    void setTapPrefetchLimitForDecidedForTesting(int limit) {
+        mTapPrefetchLimitForDecided = limit;
+    }
+
+    @VisibleForTesting
+    void setTapPrefetchLimitForUndecidedForTesting(int limit) {
+        mTapPrefetchLimitForUndecided = limit;
+    }
+
+    @VisibleForTesting
+    void setTapResolveLimitForUndecidedForTesting(int limit) {
+        mTapResolveLimitForUndecided = limit;
+    }
+
     // --------------------------------------------------------------------------------------------
     // Private helpers.
     // --------------------------------------------------------------------------------------------
@@ -456,32 +484,14 @@
      * @return Whether the tap resolve limit has been exceeded.
      */
     private boolean isTapResolveBeyondTheLimit() {
-        return isTapResolveLimited() && getTapCount() > getTapResolveLimit();
+        return getTapCount() > getTapResolveLimit();
     }
 
     /**
      * @return Whether the tap resolve limit has been exceeded.
      */
     private boolean isTapPrefetchBeyondTheLimit() {
-        return isTapPrefetchLimited() && getTapCount() > getTapPrefetchLimit();
-    }
-
-    /**
-     * @return Whether a tap gesture is resolve-limited.
-     */
-    private boolean isTapResolveLimited() {
-        return isUserUndecided()
-                ? ContextualSearchFieldTrial.isTapResolveLimitedForUndecided()
-                : ContextualSearchFieldTrial.isTapResolveLimitedForDecided();
-    }
-
-    /**
-     * @return Whether a tap gesture is resolve-limited.
-     */
-    private boolean isTapPrefetchLimited() {
-        return isUserUndecided()
-                ? ContextualSearchFieldTrial.isTapPrefetchLimitedForUndecided()
-                : ContextualSearchFieldTrial.isTapPrefetchLimitedForDecided();
+        return getTapCount() > getTapPrefetchLimit();
     }
 
     /**
@@ -489,8 +499,8 @@
      */
     private int getTapPrefetchLimit() {
         return isUserUndecided()
-                ? ContextualSearchFieldTrial.getTapPrefetchLimitForUndecided()
-                : ContextualSearchFieldTrial.getTapPrefetchLimitForDecided();
+                ? getTapPrefetchLimitForUndecided()
+                : getTapPrefetchLimitForDecided();
     }
 
     /**
@@ -498,7 +508,27 @@
      */
     private int getTapResolveLimit() {
         return isUserUndecided()
-                ? ContextualSearchFieldTrial.getTapResolveLimitForUndecided()
-                : ContextualSearchFieldTrial.getTapResolveLimitForDecided();
+                ? getTapResolveLimitForUndecided()
+                : getTapResolveLimitForDecided();
+    }
+
+    private int getTapPrefetchLimitForDecided() {
+        if (mTapPrefetchLimitForDecided != null) return mTapPrefetchLimitForDecided.intValue();
+        return TAP_PREFETCH_LIMIT_FOR_DECIDED;
+    }
+
+    private int getTapResolveLimitForDecided() {
+        if (mTapResolveLimitForDecided != null) return mTapResolveLimitForDecided.intValue();
+        return TAP_RESOLVE_LIMIT_FOR_DECIDED;
+    }
+
+    private int getTapPrefetchLimitForUndecided() {
+        if (mTapPrefetchLimitForUndecided != null) return mTapPrefetchLimitForUndecided.intValue();
+        return TAP_PREFETCH_LIMIT_FOR_UNDECIDED;
+    }
+
+    private int getTapResolveLimitForUndecided() {
+        if (mTapResolveLimitForUndecided != null) return mTapResolveLimitForUndecided.intValue();
+        return TAP_RESOLVE_LIMIT_FOR_UNDECIDED;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java
index 12dcd2f6..a559087c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadCallable.java
@@ -100,8 +100,7 @@
         }
 
         boolean isLimited = mPermManager.isUploadLimited();
-        long uploadFileSize = mFileToUpload.length();
-        if (isLimited && !isUploadSizeAndFrequencyAllowed(uploadFileSize)) {
+        if (isLimited) {
             Log.i(TAG, "Minidump cannot currently be uploaded due to constraints.");
             return UPLOAD_FAILURE;
         }
@@ -121,9 +120,6 @@
             streamCopy(minidumpInputStream, new GZIPOutputStream(connection.getOutputStream()));
             boolean success = handleExecutionResponse(connection);
 
-            // Need to save file size beforehand as |handleExecutionResponse| deletes the file if
-            // the upload was successful.
-            if (success && isLimited) updateUploadPrefs(uploadFileSize);
             return success ? UPLOAD_SUCCESS : UPLOAD_FAILURE;
         } catch (IOException e) {
             // For now just log the stack trace.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index 114c939..dc24a76 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -31,9 +31,9 @@
 import org.chromium.chrome.browser.KeyboardShortcuts;
 import org.chromium.chrome.browser.WebContentsFactory;
 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
-import org.chromium.chrome.browser.appmenu.ChromeAppMenuPropertiesDelegate;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument;
+import org.chromium.chrome.browser.datausage.DataUseTabUIManager;
 import org.chromium.chrome.browser.rappor.RapporServiceBridge;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabIdManager;
@@ -228,6 +228,10 @@
                 return showActionButton();
             }
         };
+        DataUseTabUIManager.onCustomTabInitialNavigation(mTab,
+                CustomTabsConnection.getInstance(getApplication())
+                        .getClientPackageNameForSession(mSession),
+                IntentHandler.getUrlFromIntent(getIntent()));
         loadUrlInCurrentTab(new LoadUrlParams(IntentHandler.getUrlFromIntent(getIntent())),
                 IntentHandler.getTimestampFromIntent(getIntent()));
         recordClientPackageName();
@@ -350,7 +354,7 @@
     }
 
     @Override
-    protected ChromeAppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
+    protected AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
         return new CustomTabAppMenuPropertiesDelegate(this, mIntentDataProvider.getMenuTitles());
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
index 40d01e4..0e6115b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -10,7 +10,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.appmenu.ChromeAppMenuPropertiesDelegate;
+import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
 import org.chromium.chrome.browser.tab.Tab;
 
 import java.util.HashMap;
@@ -20,15 +20,14 @@
 /**
  * App menu properties delegate for {@link CustomTabActivity}.
  */
-public class CustomTabAppMenuPropertiesDelegate extends ChromeAppMenuPropertiesDelegate {
+public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegate {
     private boolean mIsCustomEntryAdded;
     private List<String> mMenuEntries;
     private Map<MenuItem, Integer> mItemToIndexMap = new HashMap<MenuItem, Integer>();
     /**
      * Creates an {@link CustomTabAppMenuPropertiesDelegate} instance.
      */
-    public CustomTabAppMenuPropertiesDelegate(ChromeActivity activity,
-            List<String> menuEntries) {
+    public CustomTabAppMenuPropertiesDelegate(ChromeActivity activity, List<String> menuEntries) {
         super(activity);
         mMenuEntries = menuEntries;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
index a19d99f..035a992 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java
@@ -4,37 +4,157 @@
 
 package org.chromium.chrome.browser.datausage;
 
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.preference.PreferenceManager;
+import android.support.v7.app.AlertDialog;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.CheckBox;
+
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.sessions.SessionTabHelper;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.content_public.common.Referrer;
 
 /**
  * Entry point to manage all UI details for measuring data use within a Tab.
  */
 public class DataUseTabUIManager {
 
+    private static final String SHARED_PREF_DATA_USE_DIALOG_OPT_OUT = "data_use_dialog_opt_out";
+
     /**
-     * Returns true if data use tracking has started within a Tab.
+     * Returns true if data use tracking has started within a Tab. When data use tracking has
+     * started, returns true only once to signify the started event.
      *
-     * @param tab The tab to see if tracking has started in.
-     * @return If data use tracking has started.
+     * @param tab The tab that may have started tracking data use.
+     * @return true If data use tracking has indeed started.
      */
-    public static boolean hasDataUseTrackingStarted(Tab tab) {
-        return nativeHasDataUseTrackingStarted(
+    public static boolean checkDataUseTrackingStarted(Tab tab) {
+        return nativeCheckDataUseTrackingStarted(
                 SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
     }
 
     /**
-     * Returns true if data use tracking has ended within a Tab.
+     * Returns true if data use tracking has ended within a Tab. When data use tracking has
+     * ended, returns true only once to signify the ended event.
      *
+     * @param tab The tab that may have ended tracking data use.
+     * @return true If data use tracking has indeed ended.
+     */
+    public static boolean checkDataUseTrackingEnded(Tab tab) {
+        return nativeCheckDataUseTrackingEnded(
+                SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
+    }
+
+    /**
+     * Tells native code that a custom tab is navigating to a url from the given client app package.
+     *
+     * @param tab The custom tab that is navigating.
+     * @param packageName The client app package for the custom tab loading a url.
+     * @param url URL that is being loaded in the custom tab.
+     */
+    public static void onCustomTabInitialNavigation(Tab tab, String packageName, String url) {
+        nativeOnCustomTabInitialNavigation(SessionTabHelper.sessionIdForTab(tab.getWebContents()),
+                packageName, url, tab.getProfile());
+    }
+
+    /**
+     * Returns whether a navigation should be paused to show a dialog telling the user that data use
+     * tracking has ended within a Tab. If the navigation should be paused, shows a dialog with the
+     * option to cancel the navigation or continue.
+     *
+     * @param activity Current activity.
      * @param tab The tab to see if tracking has ended in.
-     * @return If data use tracking has ended.
+     * @param url URL that is pending.
+     * @param pageTransitionType The type of transition. see
+     *            {@link org.chromium.content.browser.PageTransition} for valid values.
+     * @param referrerUrl URL for the referrer.
+     * @return true If the URL loading should be overriden.
      */
-    public static boolean hasDataUseTrackingEnded(Tab tab) {
-        return nativeHasDataUseTrackingEnded(
-                SessionTabHelper.sessionIdForTab(tab.getWebContents()), tab.getProfile());
+    public static boolean shouldOverrideUrlLoading(Activity activity,
+            final Tab tab, final String url, final int pageTransitionType,
+            final String referrerUrl) {
+        if (!getOptedOutOfDataUseDialog(activity) && checkDataUseTrackingEnded(tab)) {
+            startDataUseDialog(activity, tab, url, pageTransitionType, referrerUrl);
+            return true;
+        }
+        return false;
     }
 
-    private static native boolean nativeHasDataUseTrackingStarted(int tabId, Profile profile);
-    private static native boolean nativeHasDataUseTrackingEnded(int tabId, Profile profile);
+    /**
+     * Shows a dialog with the option to cancel the navigation or continue. Also allows the user to
+     * opt out of seeing this dialog again.
+     *
+     * @param activity Current activity.
+     * @param tab The tab loading the url.
+     * @param url URL that is pending.
+     * @param pageTransitionType The type of transition. see
+     *            {@link org.chromium.content.browser.PageTransition} for valid values.
+     * @param referrerUrl URL for the referrer.
+     */
+    private static void startDataUseDialog(final Activity activity, final Tab tab,
+            final String url, final int pageTransitionType, final String referrerUrl) {
+        View checkBoxView = View.inflate(activity, R.layout.data_use_dialog, null);
+        final CheckBox checkBox = (CheckBox) checkBoxView.findViewById(R.id.data_use_checkbox);
+        new AlertDialog.Builder(activity, R.style.AlertDialogTheme)
+                .setTitle(R.string.data_use_tracking_ended_title)
+                .setMessage(R.string.data_use_tracking_ended_message)
+                .setView(checkBoxView)
+                .setPositiveButton(R.string.data_use_tracking_ended_continue,
+                        new OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                setOptedOutOfDataUseDialog(activity, checkBox.isChecked());
+                                LoadUrlParams loadUrlParams = new LoadUrlParams(url,
+                                        pageTransitionType);
+                                if (!TextUtils.isEmpty(referrerUrl)) {
+                                    Referrer referrer = new Referrer(referrerUrl,
+                                            Referrer.REFERRER_POLICY_ALWAYS);
+                                    loadUrlParams.setReferrer(referrer);
+                                }
+                                tab.loadUrl(loadUrlParams);
+                            }
+                        })
+                .setNegativeButton(R.string.cancel, new OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        setOptedOutOfDataUseDialog(activity, checkBox.isChecked());
+                    }
+                })
+                .show();
+    }
+
+    /**
+     * Returns true if the user has opted out of seeing the data use dialog.
+     *
+     * @param context An Android context.
+     * @return true If the user has opted out of seeing the data use dialog.
+     */
+    public static boolean getOptedOutOfDataUseDialog(Context context) {
+        return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
+                SHARED_PREF_DATA_USE_DIALOG_OPT_OUT, false);
+    }
+
+    /**
+     * Sets whether the user has opted out of seeing the data use dialog.
+     *
+     * @param context An Android context.
+     * @param optedOut Whether the user has opted out of seeing the data use dialog.
+     */
+    private static void setOptedOutOfDataUseDialog(Context context, boolean optedOut) {
+        PreferenceManager.getDefaultSharedPreferences(context).edit()
+                .putBoolean(SHARED_PREF_DATA_USE_DIALOG_OPT_OUT, optedOut)
+                .apply();
+    }
+
+    private static native boolean nativeCheckDataUseTrackingStarted(int tabId, Profile profile);
+    private static native boolean nativeCheckDataUseTrackingEnded(int tabId, Profile profile);
+    private static native void nativeOnCustomTabInitialNavigation(int tabID, String packageName,
+            String url, Profile profile);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java
index 2fc25f87..ebd1df19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java
@@ -73,6 +73,7 @@
         if (uri == null) {
             return null;
         }
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.setDataAndType(uri, "*/*");
         return intent;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java
index f8f795b..c18df6c2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java
@@ -19,10 +19,14 @@
  * to the service listening to them.
  * This is there for backward compatibility with JB_MR0 and JB_MR1.
  */
-public class MediaButtonReceiver extends BroadcastReceiver {
+public abstract class MediaButtonReceiver extends BroadcastReceiver {
     private static final String LISTENER_SERVICE_CLASS_NAME =
             "org.chromium.chrome.browser.media.ui"
             + "MediaNotificationManager$ListenerService";
+    public static final String EXTRA_NOTIFICATION_ID =
+            "MediaNotificationManager.ListenerService.NOTIFICATION_ID";
+
+    public abstract int getNotificationId();
 
     @Override
     public void onReceive(Context context, Intent intent) {
@@ -39,6 +43,7 @@
         assert LISTENER_SERVICE_CLASS_NAME.equals(component.getClassName());
 
         intent.setComponent(component);
+        intent.putExtra(EXTRA_NOTIFICATION_ID, getNotificationId());
         context.startService(intent);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
index 2c71d30..8ed80d55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -26,6 +26,7 @@
 import android.widget.RemoteViews;
 
 import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.Log;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.tab.Tab;
 
@@ -37,6 +38,8 @@
  */
 public class MediaNotificationManager {
 
+    private static final String TAG = "cr_MediaNotification";
+
     // We're always used on the UI thread but the LOCK is required by lint when creating the
     // singleton.
     private static final Object LOCK = new Object();
@@ -57,7 +60,7 @@
         private static final String ACTION_STOP =
                 "MediaNotificationManager.ListenerService.STOP";
         private static final String EXTRA_NOTIFICATION_ID =
-                "MediaNotificationManager.ListenerService.NOTIFICATION_ID";
+                MediaButtonReceiver.EXTRA_NOTIFICATION_ID;
 
         // The notification id this service instance corresponds to.
         private int mNotificationId = MediaNotificationInfo.INVALID_ID;
@@ -92,9 +95,22 @@
         private boolean processIntent(Intent intent) {
             if (intent == null) return false;
 
-            mNotificationId = intent.getIntExtra(
+            int notificationId = intent.getIntExtra(
                     EXTRA_NOTIFICATION_ID, MediaNotificationInfo.INVALID_ID);
-            if (mNotificationId == MediaNotificationInfo.INVALID_ID) return false;
+
+            // The notification id must always be valid and should match the first notification id
+            // the service got via the intent.
+            if (notificationId == MediaNotificationInfo.INVALID_ID
+                    || (mNotificationId != MediaNotificationInfo.INVALID_ID
+                        && mNotificationId != notificationId)) {
+                Log.w(TAG, "The service intent's notification id is invalid: ", notificationId);
+                return false;
+            }
+
+            // Either the notification id matches or it's the first intent we've got.
+            mNotificationId = notificationId;
+
+            assert mNotificationId != MediaNotificationInfo.INVALID_ID;
 
             MediaNotificationManager manager = getManager(mNotificationId);
             if (manager == null || manager.mMediaNotificationInfo == null) return false;
@@ -164,6 +180,28 @@
         private static final int NOTIFICATION_ID = R.id.presentation_notification;
     }
 
+    // Two classes to specify the right notification id in the intent.
+
+    /**
+     * This class is used internally but have to be public to be able to launch the service.
+     */
+    public static final class PlaybackMediaButtonReceiver extends MediaButtonReceiver {
+        @Override
+        public int getNotificationId() {
+            return PlaybackListenerService.NOTIFICATION_ID;
+        }
+    }
+
+    /**
+     * This class is used internally but have to be public to be able to launch the service.
+     */
+    public static final class PresentationMediaButtonReceiver extends MediaButtonReceiver {
+        @Override
+        public int getNotificationId() {
+            return PresentationListenerService.NOTIFICATION_ID;
+        }
+    }
+
     private static Intent getIntent(Context context, int notificationId) {
         Intent intent = null;
         if (notificationId == PlaybackListenerService.NOTIFICATION_ID) {
@@ -176,6 +214,19 @@
         return intent.putExtra(ListenerService.EXTRA_NOTIFICATION_ID, notificationId);
     }
 
+    private static String getButtonReceiverClassName(int notificationId) {
+        if (notificationId == PlaybackListenerService.NOTIFICATION_ID) {
+            return PlaybackMediaButtonReceiver.class.getName();
+        }
+
+        if (notificationId == PresentationListenerService.NOTIFICATION_ID) {
+            return PresentationMediaButtonReceiver.class.getName();
+        }
+
+        assert false;
+        return null;
+    }
+
     /**
      * Shows the notification with media controls with the specified media info. Replaces/updates
      * the current notification if already showing. Does nothing if |mediaNotificationInfo| hasn't
@@ -535,7 +586,7 @@
                 mContext,
                 mContext.getString(R.string.app_name),
                 new ComponentName(mContext.getPackageName(),
-                        MediaButtonReceiver.class.getName()),
+                        getButtonReceiverClassName(mMediaNotificationInfo.id)),
                 null);
         mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
                 | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
index b51a946..4177efb5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUIManager.java
@@ -21,6 +21,7 @@
 import android.util.Log;
 
 import org.chromium.base.CommandLine;
+import org.chromium.base.FieldTrialList;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.metrics.RecordUserAction;
@@ -531,13 +532,26 @@
         return icon;
     }
 
+    /**
+     * Determines whether to use standard notification layouts, using NotificationCompat.Builder,
+     * or custom layouts using Chrome's own templates.
+     *
+     * The --{enable,disable}-web-notification-custom-layouts
+     * command line flags take precedence over a running Finch trial.
+     *
+     * @return Whether custom layouts should be used.
+     */
     private static boolean useCustomLayouts() {
-        // TODO(mvanouwerkerk): Add Finch experiment for enabling / disabling the feature.
+        // Query the field trial state first to ensure correct UMA reporting.
+        String groupName = FieldTrialList.findFullName("WebNotificationCustomLayouts");
         CommandLine commandLine = CommandLine.getInstance();
         if (commandLine.hasSwitch(ChromeSwitches.DISABLE_WEB_NOTIFICATION_CUSTOM_LAYOUTS)) {
             return false;
         }
-        return commandLine.hasSwitch(ChromeSwitches.ENABLE_WEB_NOTIFICATION_CUSTOM_LAYOUTS);
+        if (commandLine.hasSwitch(ChromeSwitches.ENABLE_WEB_NOTIFICATION_CUSTOM_LAYOUTS)) {
+            return true;
+        }
+        return groupName.equals("Enabled");
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
index 944ef2b..adacddf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/DataUseSnackbarController.java
@@ -9,7 +9,7 @@
 import org.chromium.chrome.R;
 
 /**
- * The controller for the data use snackbars. This handles two snackbars:
+ * The controller for two data use snackbars:
  *
  * 1. When Chrome starts tracking data use in a Tab, it shows a snackbar informing the user that
  * data use tracking has started.
@@ -22,7 +22,7 @@
     private final Context mContext;
 
     /**
-     * Creates an instance of a {@link DataUseBarPopupController}.
+     * Creates an instance of a {@link DataUseSnackbarController}.
      * @param context The {@link Context} in which snackbar is shown.
      * @param snackbarManager The manager that helps to show up snackbar.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
index 031c067..08e4aa38 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
@@ -8,6 +8,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeApplication;
+import org.chromium.chrome.browser.datausage.DataUseTabUIManager;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.OverrideUrlLoadingResult;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationParams;
@@ -20,7 +21,8 @@
 
 /**
  * Class that controls navigations and allows to intercept them. It is used on Android to 'convert'
- * certain navigations to Intents to 3rd party applications.
+ * certain navigations to Intents to 3rd party applications and to "pause" navigations when data use
+ * tracking has ended.
  */
 public class InterceptNavigationDelegateImpl implements InterceptNavigationDelegate {
     private final ChromeActivity mActivity;
@@ -106,8 +108,7 @@
                 .setShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent(shouldCloseTab
                         && navigationParams.isMainFrame)
                 .build();
-        ExternalNavigationHandler.OverrideUrlLoadingResult result =
-                mExternalNavHandler.shouldOverrideUrlLoading(params);
+        OverrideUrlLoadingResult result = mExternalNavHandler.shouldOverrideUrlLoading(params);
         mLastOverrideUrlLoadingResult = result;
         switch (result) {
             case OVERRIDE_WITH_EXTERNAL_INTENT:
@@ -130,7 +131,8 @@
                     logBlockedNavigationToDevToolsConsole(url);
                     return true;
                 }
-                return false;
+                return DataUseTabUIManager.shouldOverrideUrlLoading(mActivity, mTab, url,
+                        navigationParams.pageTransitionType, navigationParams.referrer);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index f4190020..837d3d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -31,7 +31,7 @@
 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper;
 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
 import org.chromium.chrome.browser.appmenu.AppMenuObserver;
-import org.chromium.chrome.browser.appmenu.ChromeAppMenuPropertiesDelegate;
+import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
 import org.chromium.chrome.browser.compositor.Invalidator;
 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
@@ -120,7 +120,7 @@
     private TemplateUrlServiceObserver mTemplateUrlObserver;
     private final LocationBar mLocationBar;
     private FindToolbarManager mFindToolbarManager;
-    private final ChromeAppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
+    private final AppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
 
     private final TabObserver mTabObserver;
     private final BookmarksBridge.BookmarkModelObserver mBookmarksObserver;
@@ -154,7 +154,7 @@
      */
     public ToolbarManager(final ChromeActivity activity,
             ToolbarControlContainer controlContainer, final AppMenuHandler menuHandler,
-            ChromeAppMenuPropertiesDelegate appMenuPropertiesDelegate,
+            AppMenuPropertiesDelegate appMenuPropertiesDelegate,
             Invalidator invalidator) {
         mActionBarDelegate = new ActionModeController.ActionBarDelegate() {
             @Override
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 658c77a9..86e226e4 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -777,15 +777,24 @@
       </message>
 
       <!-- Data Use -->
-      <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_MESSAGE" desc="Message shown when data use tracking begins.">
-        Your data use is being tracked
+      <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_MESSAGE" desc="Message shown when data use tracking starts.">
+         Data use is being tracked
       </message>
-      <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_ACTION" desc="Button to learn more when data use tracking begins.">
+      <message name="IDS_DATA_USE_TRACKING_STARTED_SNACKBAR_ACTION" desc="Button to learn more when data use tracking starts.">
         More
       </message>
       <message name="IDS_DATA_USE_TRACKING_ENDED_TITLE" desc="Message shown when data use tracking has ended. Used by both the snackbar and dialog.">
         Data use tracking has ended
       </message>
+      <message name="IDS_DATA_USE_TRACKING_ENDED_MESSAGE" desc="Message shown on the dialog when data use tracking has ended.">
+        Your data use will no longer be measured.
+      </message>
+      <message name="IDS_DATA_USE_TRACKING_ENDED_CHECKBOX_MESSAGE" desc="Message shown to opt out of seeing dialogs when data use tracking has ended.">
+        Don’t ask me again
+      </message>
+      <message name="IDS_DATA_USE_TRACKING_ENDED_CONTINUE" desc="Continue button for the dialog shown when data use tracking has ended. When clicked, the page resumes loading.">
+        Continue
+      </message>
 
       <!-- About Chrome preferences -->
       <message name="IDS_PREFS_ABOUT_CHROME" desc="Title for the About Chrome page. [CHAR-LIMIT=32]">
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 89dc5b3..63513a04 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">ቀርፋፋ ግንኙነት ተገኝቷል።</translation>
 <translation id="2842985007712546952">ወላጅ አቃፊ</translation>
 <translation id="2870560284913253234">ጣቢያ</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 ዩአርኤል በአቅራቢያ}one{# ዩአርኤሎች በአቅራቢያ}other{# ዩአርኤሎች በአቅራቢያ}}</translation>
 <translation id="2888126860611144412">ስለChrome</translation>
 <translation id="2891154217021530873">ገጹን መጫን አቁም</translation>
 <translation id="2902702728133930130">Chrome ባልተጠበቀ ስህተት ምክንያት ሊጀምር አልቻለም።</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">ይህ መለያ የሚቀናበረው በ<ph name="DOMAIN_NAME" /> ነው።
 
 በሚቀናበር መለያ እየገቡ ነው፣ ይህም የChrome መገለጫዎ ቁጥጥር ለአስተዳዳሪው ይሰጠዋል። የእርስዎ Chrome ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር የተሳሰረ ይሆናል። ከዚህ መለያ ማላቀቅ አካባቢያዊውን የChrome ውሂብ ይሰርዘዋል።</translation>
+<translation id="3384347053049321195">ምስል አጋራ</translation>
 <translation id="3410346880900521918">ይህን በተደጋጋሚነት እያዩት ከሆኑ እነዚህን <ph name="BEGIN_LINK" />የአስተያየት ጥቆማዎች<ph name="END_LINK" /> ይሞክሩ።</translation>
 <translation id="3414952576877147120">መጠን፦</translation>
 <translation id="3485544713029068372">Smart Lock ለይለፍ ቃላት</translation>
@@ -457,6 +457,7 @@
 <translation id="7648422057306047504">የይለፍ ቃላትን በGoogle ምስክርነቶች መስጥር</translation>
 <translation id="7658239707568436148">ይቅር</translation>
 <translation id="7665369617277396874">መለያ ያክሉ</translation>
+<translation id="7735023902678907596">ማንነት በማያሳውቁ ትሮች ላይ የሚያዩዋቸው ገጾች ሁሉንም ማንነት የማያሳውቁ ትሮችዎን ከዘጉ በኋላ በእርስዎ የአሳሽ ታሪክ፣ የኩኪ ማከማቻ ወይም የፍለጋ ታሪክ ውስጥ አይቆዩም። የሚያወርዷቸው ማንኛቸውም ፋይሎች ወይም የተቀመጡ ገፆች ይቀመጣሉ። ይሁንና እርስዎ ስውር አይደሉም። ማንነት በማያሳውቅ ሁነታ ላይ መሆን የእርስዎን አሰሳ ከአሰሪዎ፣ ከበይነመረብ አገልጋይዎ ወይም ከሚጎበኟቸው ድር ጣቢያዎች አይደብቁዎትም።</translation>
 <translation id="7761240775244195612">ባለፈው ወር ጥቅም ላይ ያልዋሉ <ph name="PAGES_NUMBER" /> የመስመር ውጭ ቅጂዎች ይሰረዙ? ይህ <ph name="TOTAL_PAGE_SIZE" /> ያህል ቦት ያጸዳል።</translation>
 <translation id="7764225426217299476">አድራሻ አክል</translation>
 <translation id="7765158879357617694">ውሰድ</translation>
@@ -543,7 +544,6 @@
 <translation id="885701979325669005">ማከማቻ</translation>
 <translation id="886510833909353412">ሁሉንም በይለፍ ሐረግ አመስጥር</translation>
 <translation id="8872441722924401214">የማረጋገጫ የእውቅና ማረጋገጫ ይምረጡ</translation>
-<translation id="8891135217544884558">አቅራቢያ ያሉ ዩአርኤሎች</translation>
 <translation id="8901170036886848654">ምንም ዕልባቶች አልተገኙም</translation>
 <translation id="8909135823018751308">አጋራ…</translation>
 <translation id="8912362522468806198">የGoogle መለያ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 704f022..c4e612a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">تم اكتشاف اتصال بطيء بالإنترنت.</translation>
 <translation id="2842985007712546952">المجلد الرئيسي</translation>
 <translation id="2870560284913253234">الموقع</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{‏عنوان URL واحد في الجوار}zero{‏# عنوان URL في الجوار}two{‏عنوانان (#) URL في الجوار}few{‏# عناوين URL في الجوار}many{‏# عنوان URL في الجوار}other{‏# عنوان URL في الجوار}}</translation>
 <translation id="2888126860611144412">‏حول Chrome</translation>
 <translation id="2891154217021530873">إيقاف تحميل الصفحة</translation>
 <translation id="2902702728133930130">‏أخفق Chrome أثناء بدء التشغيل بسبب خطأ غير متوقع.</translation>
@@ -156,6 +155,7 @@
 <translation id="3343085080042659442">‏إصدار Chrome قديم. تتوفر تحسينات أمان مهمة وميزات جديدة في أحدث إصدار.</translation>
 <translation id="3350687908700087792">إغلاق كافة علامات تبويب التصفح المتخفي</translation>
 <translation id="3358663646935160692">‏تتم إدارة هذا الحساب من خلال <ph name="DOMAIN_NAME" />. لقد سجلت دخولك باستخدام حساب مُدار تمنح المشرف عليه إمكانية التحكم في ملفك الشخصي على Chrome. ستظل بياناتك على Chrome مرتبطة دائمًا بهذا الحساب. ويؤدي إلغاء الربط بهذا الحساب إلى حذف بيانات Chrome المحلية.</translation>
+<translation id="3384347053049321195">مشاركة صورة</translation>
 <translation id="3410346880900521918">إذا كنت تشاهد هذا بكثرة، فجرّب هذه <ph name="BEGIN_LINK" />الاقتراحات<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">الحجم:</translation>
 <translation id="3485544713029068372">‏Smart Lock لكلمات المرور</translation>
@@ -455,6 +455,9 @@
 <translation id="7648422057306047504">‏تشفير كلمات المرور باستخدام بيانات اعتماد Google</translation>
 <translation id="7658239707568436148">إلغاء</translation>
 <translation id="7665369617277396874">إضافة حساب</translation>
+<translation id="7735023902678907596">لن تظهر الصفحات التي تشاهدها في علامات تبويب التصفح المتخفي في سجل متصفحك ولا في وحدة تخزين ملفات تعريف الارتباط ولا في سجل البحث بعد إغلاق جميع علامات تبويب التصفح المتخفي. وستُحفظ أي ملفات تم تنزيلها أو أي صفحات تم حفظها.
+
+لكنك لن تكون غير مرئي، فاستخدام وضع التصفح المتخفي لا يخفي تصفحك عن صاحب العمل أو مزود خدمة الإنترنت أو مواقع الويب التي تزورها.</translation>
 <translation id="7761240775244195612">هل تريد حذف <ph name="PAGES_NUMBER" /> نسخ في وضع عدم الاتصال والتي لم تستخدم في الشهر الماضي؟ سيعمل ذلك على تفريغ <ph name="TOTAL_PAGE_SIZE" /> من المساحة.</translation>
 <translation id="7764225426217299476">إضافة عنوان</translation>
 <translation id="7765158879357617694">نقل</translation>
@@ -541,7 +544,6 @@
 <translation id="885701979325669005">التخزين</translation>
 <translation id="886510833909353412">تشفير الكل باستخدام عبارة مرور</translation>
 <translation id="8872441722924401214">اختيار شهادة للمصادقة</translation>
-<translation id="8891135217544884558">‏عناوين URL للأجهزة المجاورة</translation>
 <translation id="8901170036886848654">لا توجد إشارات مرجعية</translation>
 <translation id="8909135823018751308">مشاركة…</translation>
 <translation id="8912362522468806198">‏حساب Google‏</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index c4141e8a5..9a042eff 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Открита е бавна връзка.</translation>
 <translation id="2842985007712546952">Основна папка</translation>
 <translation id="2870560284913253234">Сайт</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL адрес в близост}other{# URL адреса в близост}}</translation>
 <translation id="2888126860611144412">Всичко за Chrome</translation>
 <translation id="2891154217021530873">Спиране на зареждането на страницата</translation>
 <translation id="2902702728133930130">Стартирането на Chrome не бе успешно поради неочаквана грешка.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Хранилище</translation>
 <translation id="886510833909353412">Шифроване на всичко с пропуск</translation>
 <translation id="8872441722924401214">Изберете сертификат за удостоверяване</translation>
-<translation id="8891135217544884558">URL адреси в близост</translation>
 <translation id="8901170036886848654">Няма намерени отметки</translation>
 <translation id="8909135823018751308">Споделяне…</translation>
 <translation id="8912362522468806198">Профил в Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 77a35290..9dfe5281c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">S'ha detectat una connexió lenta.</translation>
 <translation id="2842985007712546952">Carpeta principal</translation>
 <translation id="2870560284913253234">Lloc</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{Un URL a prop}other{# URL a prop}}</translation>
 <translation id="2888126860611144412">Quant a Chrome </translation>
 <translation id="2891154217021530873">Atura la càrrega de la pàgina</translation>
 <translation id="2902702728133930130">S'ha produït un error inesperat amb Chrome durant l'arrencada.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Emmagatzematge</translation>
 <translation id="886510833909353412">Encripta-ho tot amb una frase de contrasenya</translation>
 <translation id="8872441722924401214">Selecció del certificat per a l'autenticació</translation>
-<translation id="8891135217544884558">URLs a prop</translation>
 <translation id="8901170036886848654">No s'ha trobat cap adreça d'interès</translation>
 <translation id="8909135823018751308">Comparteix...</translation>
 <translation id="8912362522468806198">Compte de Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 4d7707f..1d97ddee 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Bylo zjištěno pomalé připojení.</translation>
 <translation id="2842985007712546952">Nadřazená složka</translation>
 <translation id="2870560284913253234">Stránky</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 adresa URL v okolí}few{# adresy URL v okolí}many{# adresy URL v okolí}other{# adres URL v okolí}}</translation>
 <translation id="2888126860611144412">O aplikaci Chrome</translation>
 <translation id="2891154217021530873">Zastavit načítání stránky</translation>
 <translation id="2902702728133930130">Spuštění Chromu se nezdařilo kvůli neočekávané chybě.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Úložiště</translation>
 <translation id="886510833909353412">Šifrovat vše pomocí heslové fráze</translation>
 <translation id="8872441722924401214">Zvolte ceritifikát pro ověření</translation>
-<translation id="8891135217544884558">Adresy URL v okolí</translation>
 <translation id="8901170036886848654">Nebyly nalezeny žádné záložky</translation>
 <translation id="8909135823018751308">Sdílet…</translation>
 <translation id="8912362522468806198">Účet Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index 30d2e4d..d7fde2d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Der er registreret en langsom forbindelse.</translation>
 <translation id="2842985007712546952">Overordnet mappe</translation>
 <translation id="2870560284913253234">Website</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 webadresse i nærheden}one{# webadresse i nærheden}other{# webadresser i nærheden}}</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
 <translation id="2891154217021530873">Stop sideindlæsning</translation>
 <translation id="2902702728133930130">Der opstod en uventet fejl under start af Chrome.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Lagerplads</translation>
 <translation id="886510833909353412">Kryptér alle med en adgangssætning</translation>
 <translation id="8872441722924401214">Vælg certifikat til godkendelse</translation>
-<translation id="8891135217544884558">Webadresser i nærheden</translation>
 <translation id="8901170036886848654">Der blev ikke fundet nogen bogmærker</translation>
 <translation id="8909135823018751308">Del…</translation>
 <translation id="8912362522468806198">Google-konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index 382ea7be..00e4c91 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Langsame Verbindung gefunden</translation>
 <translation id="2842985007712546952">Übergeordneter Ordner</translation>
 <translation id="2870560284913253234">Website</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL in der Nähe}other{# URLs in der Nähe}}</translation>
 <translation id="2888126860611144412">Info zu Chrome</translation>
 <translation id="2891154217021530873">Laden der Seite anhalten</translation>
 <translation id="2902702728133930130">Während des Startvorgangs ist in Chrome ein unerwarteter Fehler aufgetreten.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Speicher</translation>
 <translation id="886510833909353412">Alle Daten mit Passphrase verschlüsseln</translation>
 <translation id="8872441722924401214">Zertifikat für Authentifizierung auswählen</translation>
-<translation id="8891135217544884558">URLs in der Nähe</translation>
 <translation id="8901170036886848654">Keine Lesezeichen gefunden</translation>
 <translation id="8909135823018751308">Teilen...</translation>
 <translation id="8912362522468806198">Google-Konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index 808eb49..5537b0b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Εντοπίστηκε αργή σύνδεση.</translation>
 <translation id="2842985007712546952">Γονικός φάκελος</translation>
 <translation id="2870560284913253234">Ιστότοπος</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 κοντινό URL}other{# κοντινά URL}}</translation>
 <translation id="2888126860611144412">Σχετικά με το Chrome</translation>
 <translation id="2891154217021530873">Διακοπή φόρτωσης σελίδας</translation>
 <translation id="2902702728133930130">Η εκκίνηση του Chrome απέτυχε λόγω ενός μη αναμενόμενου σφάλματος.</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">Αυτός ο λογαριασμός τελεί υπό διαχείριση του <ph name="DOMAIN_NAME" />.
  
 Έχετε συνδεθεί με έναν διαχειριζόμενο λογαριασμό και παραχωρείτε τον έλεχγο διαχείρισής του μέσω του προφίλ σας Chrome. Τα δεδομένα σας Chrome θα συσχετιστούν μόνιμα με αυτόν το λογαριασμό. Η αποσύνδεση από αυτόν το λογαριασμό θα διαγράψει τα τοπικά δεδομένα Chrome.</translation>
+<translation id="3384347053049321195">Κοινοποίηση εικόνας</translation>
 <translation id="3410346880900521918">Εάν αυτό το μήνυμα εμφανίζεται συχνά, δοκιμάστε αυτές τις <ph name="BEGIN_LINK" />προτάσεις<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">Μέγεθος:</translation>
 <translation id="3485544713029068372">Smart Lock για κωδικούς πρόσβασης</translation>
@@ -458,6 +458,9 @@
 <translation id="7648422057306047504">Κρυπτογράφηση κωδικών πρόσβασης με τα διαπιστευτήριά σας Google.</translation>
 <translation id="7658239707568436148">Ακύρωση</translation>
 <translation id="7665369617277396874">Προσθήκη λογαριασμού</translation>
+<translation id="7735023902678907596">Οι σελίδες που προβάλετε στις καρτέλες της ανώνυμης περιήγησης δεν διατηρούνται στο ιστορικό του προγράμματος περιήγησής σας, στα cookie ή στο ιστορικό αναζήτησης, αφού κλείσετε όλες τις καρτέλες της ανώνυμης περιήγησης. Τα αρχεία που έχετε κατεβάσει ή οι σελίδες που έχετε αποθηκεύσει θα διατηρηθούν.
+
+Ωστόσο, δεν είστε αόρατοι. Με την ανώνυμη περιήγηση δεν γίνεται απόκρυψη της περιήγησής σας από τον εργοδότη σας, τον παροχέα υπηρεσιών διαδικτύου ή τους ιστότοπους που επισκέπτεστε.</translation>
 <translation id="7761240775244195612">Να  διαγραφούν <ph name="PAGES_NUMBER" /> αντίγραφα εκτός σύνδεσης που δεν χρησιμοποιήθηκαν τον περασμένο μήνα; Με αυτόν τον τρόπο θα απελευθερωθούν <ph name="TOTAL_PAGE_SIZE" /> αποθηκευτικού χώρου.</translation>
 <translation id="7764225426217299476">Προσθήκη διεύθυνσης</translation>
 <translation id="7765158879357617694">Μεταφορά</translation>
@@ -544,7 +547,6 @@
 <translation id="885701979325669005">Αποθήκευση</translation>
 <translation id="886510833909353412">Κρυπτογράφηση όλων με φράση πρόσβασης</translation>
 <translation id="8872441722924401214">Επιλέξτε πιστοποιητικό για επαλήθευση</translation>
-<translation id="8891135217544884558">Διευθύνσεις URL σε κοντινές συσκευές</translation>
 <translation id="8901170036886848654">Δεν βρέθηκαν σελιδοδείκτες</translation>
 <translation id="8909135823018751308">Κοινή χρήση…</translation>
 <translation id="8912362522468806198">Λογαριασμός Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index b1ebf5a9..c9c0418 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Slow connection detected.</translation>
 <translation id="2842985007712546952">Parent folder</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL nearby}other{# URLs nearby}}</translation>
 <translation id="2888126860611144412">About Chrome</translation>
 <translation id="2891154217021530873">Stop page loading</translation>
 <translation id="2902702728133930130">Chrome failed during start-up with an unexpected error.</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">This account is managed by <ph name="DOMAIN_NAME" />.
 
 You are signing in with a managed account and giving its administrator control over your Chrome profile. Your Chrome data will become permanently tied to this account. Disconnecting from this account will delete the local Chrome data.</translation>
+<translation id="3384347053049321195">Share image</translation>
 <translation id="3410346880900521918">If you're seeing this frequently, try these <ph name="BEGIN_LINK" />suggestions<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">Size:</translation>
 <translation id="3485544713029068372">Smart Lock for Passwords</translation>
@@ -457,6 +457,9 @@
 <translation id="7648422057306047504">Encrypt passwords with Google credentials</translation>
 <translation id="7658239707568436148">Cancel</translation>
 <translation id="7665369617277396874">Add account</translation>
+<translation id="7735023902678907596">Pages that you view in incognito tabs won’t stick around in your browser’s history, cookie store or search history after you’ve closed all of your incognito tabs. Any downloaded files or saved pages will be kept.
+
+However, you aren’t invisible. Going incognito doesn’t hide your browsing from your employer, your Internet service provider or the websites that you visit.</translation>
 <translation id="7761240775244195612">Delete <ph name="PAGES_NUMBER" /> offline copies not used in the past month? This will clear <ph name="TOTAL_PAGE_SIZE" /> of space.</translation>
 <translation id="7764225426217299476">Add address</translation>
 <translation id="7765158879357617694">Move</translation>
@@ -541,7 +544,6 @@
 <translation id="885701979325669005">Storage</translation>
 <translation id="886510833909353412">Encrypt all with passphrase</translation>
 <translation id="8872441722924401214">Choose certificate for authentication</translation>
-<translation id="8891135217544884558">Nearby URLs</translation>
 <translation id="8901170036886848654">No bookmarks found</translation>
 <translation id="8909135823018751308">Share…</translation>
 <translation id="8912362522468806198">Google Account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index dff9db9..09749f7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Se detectó una conexión lenta.</translation>
 <translation id="2842985007712546952">Carpeta principal</translation>
 <translation id="2870560284913253234">Sitio</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL cercana}other{# URL cercanas}}</translation>
 <translation id="2888126860611144412">Acerca de Chrome</translation>
 <translation id="2891154217021530873">Detener la carga de la página</translation>
 <translation id="2902702728133930130">Se produjo un error inesperado durante el inicio de Chrome.</translation>
@@ -544,7 +543,6 @@
 <translation id="885701979325669005">Almacenamiento</translation>
 <translation id="886510833909353412">Encriptar todos los datos con una frase de contraseña</translation>
 <translation id="8872441722924401214">Seleccionar certificado para autenticación</translation>
-<translation id="8891135217544884558">URL cercanas</translation>
 <translation id="8901170036886848654">No se encontraron marcadores</translation>
 <translation id="8909135823018751308">Compartir…</translation>
 <translation id="8912362522468806198">Cuenta de Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 46ca396..63ba8eff 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Conexión lenta detectada.</translation>
 <translation id="2842985007712546952">Carpeta principal</translation>
 <translation id="2870560284913253234">Sitio</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL cercana}other{# URLs cercanas}}</translation>
 <translation id="2888126860611144412">Acerca de Chrome</translation>
 <translation id="2891154217021530873">Detener la carga de la página</translation>
 <translation id="2902702728133930130">Se ha producido un error inesperado en Chrome durante el inicio.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Almacenamiento</translation>
 <translation id="886510833909353412">Cifrar todo con frase de contraseña</translation>
 <translation id="8872441722924401214">Selecciona un certificado para la autenticación</translation>
-<translation id="8891135217544884558">URL cercanas</translation>
 <translation id="8901170036886848654">No se han encontrado marcadores</translation>
 <translation id="8909135823018751308">Compartir…</translation>
 <translation id="8912362522468806198">cuenta de Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index 9929580..67516d8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">اتصال آهسته شناسایی شد.</translation>
 <translation id="2842985007712546952">پوشه اصلی</translation>
 <translation id="2870560284913253234">سایت</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{۱ نشانی وب اطراف}one{# نشانی وب اطراف}other{# نشانی وب اطراف}}</translation>
 <translation id="2888126860611144412">‏درباره Chrome</translation>
 <translation id="2891154217021530873">توقف بارگیری صفحه</translation>
 <translation id="2902702728133930130">‏Chrome در هنگام شروع به کار با خطایی غیرمنتظره متوقف شد.</translation>
@@ -542,7 +541,6 @@
 <translation id="885701979325669005">فضای ذخیره‌سازی</translation>
 <translation id="886510833909353412">رمزگذاری همه با عبارت عبور</translation>
 <translation id="8872441722924401214">انتخاب گواهی برای احراز هویت</translation>
-<translation id="8891135217544884558">نشانی‌های وب نزدیک</translation>
 <translation id="8901170036886848654">نشانکی پیدا نشد</translation>
 <translation id="8909135823018751308">اشتراک‌گذاری‌...</translation>
 <translation id="8912362522468806198">‏حساب Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 5fc89e9..39b7c98 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Hidas yhteys havaittu.</translation>
 <translation id="2842985007712546952">Ylätason kansio</translation>
 <translation id="2870560284913253234">Sivusto</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{Lähistöllä on 1 URL-osoite.}other{Lähistöllä on # URL-osoitetta.}}</translation>
 <translation id="2888126860611144412">Tietoja Chromesta</translation>
 <translation id="2891154217021530873">Pysäytä sivun lataus</translation>
 <translation id="2902702728133930130">Chromen käynnistys epäonnistui odottamattoman virheen takia.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Tallennus</translation>
 <translation id="886510833909353412">Salaa kaikki tunnuslauseella.</translation>
 <translation id="8872441722924401214">Valitse todennuksen varmenne</translation>
-<translation id="8891135217544884558">Läheiset URL-osoitteet</translation>
 <translation id="8901170036886848654">Kirjanmerkkejä ei löytynyt.</translation>
 <translation id="8909135823018751308">Jaa…</translation>
 <translation id="8912362522468806198">Google-tilisi avulla</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index e75774e..8efb602 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Na-detect ang mabagal na koneksyon.</translation>
 <translation id="2842985007712546952">Pangunahing folder</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL sa malapit}one{# URL sa malapit}other{# na URL sa malapit}}</translation>
 <translation id="2888126860611144412">Tungkol sa Chrome</translation>
 <translation id="2891154217021530873">Ihinto ang pag-load ng page</translation>
 <translation id="2902702728133930130">Nagkaroon ng hindi inaasahang error ang Chrome habang nagsasagawa ng pag-start up.</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">Pinamamahalaan ang account na ito ng <ph name="DOMAIN_NAME" />.
 
 Nagsa-sign in ka sa isang pinamamahalaang account at nagbibigay sa administrator nito ng kontrol sa iyong profile sa Chrome. Permanenteng mauugnay ang iyong data ng Chrome sa account na ito. Ang pagdiskonekta mula sa account na ito ay magtatanggal sa lokal na data ng Chrome.</translation>
+<translation id="3384347053049321195">Magbahagi ng larawan</translation>
 <translation id="3410346880900521918">Kung madalas mo itong makita, subukan ang <ph name="BEGIN_LINK" />mga suhestyon<ph name="END_LINK" /> na ito.</translation>
 <translation id="3414952576877147120">Laki:</translation>
 <translation id="3485544713029068372">Smart Lock para sa Mga Password</translation>
@@ -457,6 +457,9 @@
 <translation id="7648422057306047504">I-encrypt ang mga password gamit ang mga kredensyal ng Google</translation>
 <translation id="7658239707568436148">Ikansela</translation>
 <translation id="7665369617277396874">Magdagdag ng account</translation>
+<translation id="7735023902678907596">Hindi mananatili ang mga titingnan mong page sa mga tab na incognito sa history, cookie store o history ng paghahanap ng iyong browser kapag nasara mo na ang lahat ng iyong tab na incognito. Hindi mawawala ang anumang mga na-download na file o na-save na page.
+
+Gayunpaman, hindi ka invisible. Kahit na gumamit ka ng tab na incognito, hindi pa rin maitatago ang iyong pagba-browse sa iyong employer, iyong internet service provider o sa mga bibisitahin mong website.</translation>
 <translation id="7761240775244195612">I-delete ang <ph name="PAGES_NUMBER" /> (na) offline na kopya na hindi nagamit sa nakaraang buwan? Maki-clear nito ang <ph name="TOTAL_PAGE_SIZE" /> ng espasyo.</translation>
 <translation id="7764225426217299476">Magdagdag ng address</translation>
 <translation id="7765158879357617694">Ilipat</translation>
@@ -543,7 +546,6 @@
 <translation id="885701979325669005">Storage</translation>
 <translation id="886510833909353412">I-encrypt ang lahat gamit ang passphrase</translation>
 <translation id="8872441722924401214">Piliin ang certificate para sa pagpapatotoo</translation>
-<translation id="8891135217544884558">Mga kalapit na URL</translation>
 <translation id="8901170036886848654">Walang nakitang bookmark</translation>
 <translation id="8909135823018751308">Ibahagi…</translation>
 <translation id="8912362522468806198">Google Account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index 7d191c7..8bf4dad 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Connexion lente détectée</translation>
 <translation id="2842985007712546952">Dossier parent</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL à proximité}one{# URL à proximité}other{# URL à proximité}}</translation>
 <translation id="2888126860611144412">À propos de Chrome</translation>
 <translation id="2891154217021530873">Arrêter le chargement de la page</translation>
 <translation id="2902702728133930130">Échec du démarrage de Chrome, en raison d'une erreur inattendue.</translation>
@@ -544,7 +543,6 @@
 <translation id="885701979325669005">Stockage</translation>
 <translation id="886510833909353412">Tout chiffrer à l'aide d'une phrase secrète</translation>
 <translation id="8872441722924401214">Sélectionnez un certificat pour l'authentification</translation>
-<translation id="8891135217544884558">URL provenant d'appareils à proximité</translation>
 <translation id="8901170036886848654">Aucun favori trouvé.</translation>
 <translation id="8909135823018751308">Partager…</translation>
 <translation id="8912362522468806198">Compte Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 0bcad83..796f0087 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">धीमे कनेक्शन का पता चला.</translation>
 <translation id="2842985007712546952">मूल फ़ोल्‍डर</translation>
 <translation id="2870560284913253234">साइट</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{आस-पास 1 URL है}one{आस-पास # URL हैं}other{आस-पास # URL हैं}}</translation>
 <translation id="2888126860611144412">क्रोम के बारे में</translation>
 <translation id="2891154217021530873">पृष्ठ को लोड करना रोकें</translation>
 <translation id="2902702728133930130">अनपेक्षित त्रुटि के साथ स्टार्टअप के दौरान Chrome विफल रहा.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">मेमोरी</translation>
 <translation id="886510833909353412">पासफ़्रेज़ से सभी एन्क्रिप्ट करें</translation>
 <translation id="8872441722924401214">प्रमाणीकरण के लिए प्रमाणपत्र चुनें</translation>
-<translation id="8891135217544884558">आस-पास के URL</translation>
 <translation id="8901170036886848654">कोई बुकमार्क नहीं मिला</translation>
 <translation id="8909135823018751308">साझा करें…</translation>
 <translation id="8912362522468806198">Google खाता</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index 92f54e7..9bb1165 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Otkrivena je spora veza.</translation>
 <translation id="2842985007712546952">Nadređena mapa</translation>
 <translation id="2870560284913253234">Web lokacija</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL u blizini}one{# URL u blizini}few{# URL-a u blizini}other{# URL-ova u blizini}}</translation>
 <translation id="2888126860611144412">O Chromeu</translation>
 <translation id="2891154217021530873">Zaustavljanje učitavanja stranice</translation>
 <translation id="2902702728133930130">Chrome se nije pokrenuo zbog neočekivane pogreške.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Prostor za pohranu</translation>
 <translation id="886510833909353412">Kriptiraj sve zaporkom</translation>
 <translation id="8872441722924401214">Odabir certifikata za autentifikaciju</translation>
-<translation id="8891135217544884558">URL-ovi u blizini</translation>
 <translation id="8901170036886848654">Nije pronađena nijedna oznaka</translation>
 <translation id="8909135823018751308">Dijeljenje…</translation>
 <translation id="8912362522468806198">Google Račun</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index 0e263f1..68abe6da 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Lassú kapcsolat észlelve.</translation>
 <translation id="2842985007712546952">Szülőmappa</translation>
 <translation id="2870560284913253234">Webhely</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL van a közelben}other{# URL van a közelben}}</translation>
 <translation id="2888126860611144412">A Chrome névjegye</translation>
 <translation id="2891154217021530873">Oldal betöltésének leállítása</translation>
 <translation id="2902702728133930130">A Chrome indítása sikertelen volt egy váratlan hiba miatt.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Tárolás</translation>
 <translation id="886510833909353412">Az összes titkosítása összetett jelszóval</translation>
 <translation id="8872441722924401214">Tanúsítvány kiválasztása a hitelesítéshez</translation>
-<translation id="8891135217544884558">Közeli URL-ek</translation>
 <translation id="8901170036886848654">Nem találtunk könyvjelzőket</translation>
 <translation id="8909135823018751308">Megosztás...</translation>
 <translation id="8912362522468806198">Google Fiókjába</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index e66f93ae..7585f34 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Sambungan lambat.</translation>
 <translation id="2842985007712546952">Folder induk</translation>
 <translation id="2870560284913253234">Situs</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL di sekitar}other{# URL di sekitar}}</translation>
 <translation id="2888126860611144412">Tentang Chrome</translation>
 <translation id="2891154217021530873">Hentikan pemuatan laman</translation>
 <translation id="2902702728133930130">Chrome gagal memulai karena ada kesalahan yang tidak terduga.</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">Akun ini dikelola oleh <ph name="DOMAIN_NAME" />.
 
 Anda masuk dengan akun yang dikelola dan memberikan administratornya kontrol atas profil Chrome Anda. Data Chrome Anda akan terikat dengan akun ini secara permanen. Memutuskan tautan dengan akun ini akan menghapus data Chrome lokal.</translation>
+<translation id="3384347053049321195">Bagikan gambar</translation>
 <translation id="3410346880900521918">Jika ini sering terjadi, coba <ph name="BEGIN_LINK" />saran-saran yang ada di sini<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">Ukuran:</translation>
 <translation id="3485544713029068372">Smart Lock untuk Sandi</translation>
@@ -457,6 +457,9 @@
 <translation id="7648422057306047504">Enkripsi sandi dengan kredensial Google</translation>
 <translation id="7658239707568436148">Batal</translation>
 <translation id="7665369617277396874">Tambahkan akun</translation>
+<translation id="7735023902678907596">Laman yang Anda lihat dalam tab penyamaran tidak akan tersimpan di riwayat, penyimpanan cookie, atau riwayat penelusuran browser setelah Anda menutup semua tab penyamaran. File apa pun yang diunduh atau laman yang disimpan tetap akan tersimpan.
+
+Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode penyamaran tidak akan menyembunyikan penjelajahan yang Anda lakukan dari atasan di kantor, dari penyedia layanan internet, maupun situs web yang Anda kunjungi.</translation>
 <translation id="7761240775244195612">Hapus <ph name="PAGES_NUMBER" /> salinan offline yang tidak digunakan selama satu bulan terakhir? Tindakan ini akan mengosongkan ruang penyimpanan sebesar <ph name="TOTAL_PAGE_SIZE" />.</translation>
 <translation id="7764225426217299476">Tambahkan alamat</translation>
 <translation id="7765158879357617694">Pindahkan</translation>
@@ -543,7 +546,6 @@
 <translation id="885701979325669005">Penyimpanan</translation>
 <translation id="886510833909353412">Enkripsi semua dengan frasa sandi</translation>
 <translation id="8872441722924401214">Pilih sertifikat untuk autentikasi</translation>
-<translation id="8891135217544884558">URL di sekitar</translation>
 <translation id="8901170036886848654">Tidak ditemukan bookmark</translation>
 <translation id="8909135823018751308">Bagikan...</translation>
 <translation id="8912362522468806198">Akun Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index 171733e..429e308 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">È stata rilevata una connessione lenta.</translation>
 <translation id="2842985007712546952">Cartella principale</translation>
 <translation id="2870560284913253234">Sito</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL vicino}other{# URL vicini}}</translation>
 <translation id="2888126860611144412">Informazioni su Chrome</translation>
 <translation id="2891154217021530873">Interrompe il caricamento della pagina</translation>
 <translation id="2902702728133930130">Impossibile avviare Chrome a causa di un errore imprevisto.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Memoria</translation>
 <translation id="886510833909353412">Cripta tutto con passphrase</translation>
 <translation id="8872441722924401214">Scegli certificato per l'autenticazione</translation>
-<translation id="8891135217544884558">URL vicini</translation>
 <translation id="8901170036886848654">Nessun Preferito trovato</translation>
 <translation id="8909135823018751308">Condividi…</translation>
 <translation id="8912362522468806198">Google Account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index 38e2302..3a75095 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">זוהה חיבור איטי.</translation>
 <translation id="2842985007712546952">תיקיית אב</translation>
 <translation id="2870560284913253234">אתר</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{כתובת אתר אחת בקרבת מקום}two{שתי כתובות אתרים בקרבת מקום}many{# כתובות אתרים בקרבת מקום}other{# כתובות אתרים בקרבת מקום}}</translation>
 <translation id="2888126860611144412">‏מידע כללי על Chrome</translation>
 <translation id="2891154217021530873">הפסק את טעינת הדף</translation>
 <translation id="2902702728133930130">‏שגיאה בלתי צפויה גרמה לכשל של Chrome בעת ההפעלה.</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">‏החשבון הזה מנוהל על ידי <ph name="DOMAIN_NAME" />.
 
 אתה נכנס לחשבון מנוהל, ונותן למנהל המערכת שליטה על פרופיל Chrome שלך. נתוני Chrome שלך ייקשרו באופן קבוע לחשבון הזה. התנתקות מהחשבון הזה תמחק את נתוני Chrome המקומיים.</translation>
+<translation id="3384347053049321195">שתף תמונה</translation>
 <translation id="3410346880900521918">אם אתה רואה זאת לעתים קרובות, נסה את ההצעות <ph name="BEGIN_LINK" />האלה<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">גודל:</translation>
 <translation id="3485544713029068372">‏Smart Lock לסיסמאות</translation>
@@ -457,6 +457,9 @@
 <translation id="7648422057306047504">‏הצפן סיסמאות באמצעות פרטי הכניסה שלך ל-Google</translation>
 <translation id="7658239707568436148">ביטול</translation>
 <translation id="7665369617277396874">הוסף חשבון</translation>
+<translation id="7735023902678907596">‏דפים שאתה מציג בכרטיסיות גלישה בסתר לא יישמרו בהיסטוריית הדפדפן, אחסון קובצי ה-cookie או היסטוריית החיפושים לאחר שתסגור את כל הכרטיסיות של גלישה בסתר. קבצים שתוריד או סימניות שתיצור יישמרו.
+
+עם זאת, אינך בלתי נראה. מעבר למצב גלישה בסתר אינו מסתיר את הגלישה שלך מהמעסיק, מספק האינטרנט או מהאתרים שבהם אתה מבקר.</translation>
 <translation id="7761240775244195612">האם למחוק <ph name="PAGES_NUMBER" /> עותקים לא מקוונים שלא היו בשימוש בחודש האחרון? הפעולה תפנה שטח של <ph name="TOTAL_PAGE_SIZE" />.</translation>
 <translation id="7764225426217299476">הוסף כתובת</translation>
 <translation id="7765158879357617694">העבר</translation>
@@ -541,7 +544,6 @@
 <translation id="885701979325669005">אחסון</translation>
 <translation id="886510833909353412">הצפן הכל באמצעות ביטוי סיסמה</translation>
 <translation id="8872441722924401214">בחירת אישור לאימות</translation>
-<translation id="8891135217544884558">כתובות אתרים בקרבת מקום</translation>
 <translation id="8901170036886848654">לא נמצאו סימניות</translation>
 <translation id="8909135823018751308">שתף…</translation>
 <translation id="8912362522468806198">‏חשבון Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 245bfa0..aa5d15b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">低速な接続が見つかりました。</translation>
 <translation id="2842985007712546952">親フォルダ</translation>
 <translation id="2870560284913253234">サイト</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{近くに 1 件の URL}other{近くに # 件の URL}}</translation>
 <translation id="2888126860611144412">Chrome について</translation>
 <translation id="2891154217021530873">ページの読み込みを停止</translation>
 <translation id="2902702728133930130">Chrome の起動時に予期しないエラーが発生し、起動できませんでした。</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">ストレージ</translation>
 <translation id="886510833909353412">すべてのデータをパスフレーズで暗号化する</translation>
 <translation id="8872441722924401214">認証用の証明書の選択</translation>
-<translation id="8891135217544884558">周辺の URL</translation>
 <translation id="8901170036886848654">ブックマークが見つかりません</translation>
 <translation id="8909135823018751308">共有...</translation>
 <translation id="8912362522468806198">Google アカウントを使用</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index fcbb4ab..fc76354b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">느린 연결이 감지되었습니다.</translation>
 <translation id="2842985007712546952">상위 폴더</translation>
 <translation id="2870560284913253234">사이트</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{주변에 1개의 URL이 있음}other{주변에 #개의 URL이 있음}}</translation>
 <translation id="2888126860611144412">크롬 정보</translation>
 <translation id="2891154217021530873">페이지 로딩 중지</translation>
 <translation id="2902702728133930130">예기치 않은 오류로 인해 Chrome을 시작하지 못했습니다.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">저장소</translation>
 <translation id="886510833909353412">암호로 모두 암호화</translation>
 <translation id="8872441722924401214">인증에 사용할 인증서 선택</translation>
-<translation id="8891135217544884558">주변 URL</translation>
 <translation id="8901170036886848654">북마크가 없습니다.</translation>
 <translation id="8909135823018751308">공유…</translation>
 <translation id="8912362522468806198">Google 계정</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index c086a381..5c4b28be 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Aptiktas lėtas ryšys.</translation>
 <translation id="2842985007712546952">Viršaplankis</translation>
 <translation id="2870560284913253234">Svetainė</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL netoliese}one{# URL netoliese}few{# URL netoliese}many{# URL netoliese}other{# URL netoliese}}</translation>
 <translation id="2888126860611144412">Apie „Chrome“</translation>
 <translation id="2891154217021530873">Sustabdyti puslapio įkėlimą</translation>
 <translation id="2902702728133930130">Nepavyko paleisti „Chrome“, nes kilo netikėta klaida.</translation>
@@ -544,7 +543,6 @@
 <translation id="885701979325669005">Saugykla</translation>
 <translation id="886510833909353412">Šifruoti viską naudojant slaptafrazę</translation>
 <translation id="8872441722924401214">Pasirinkite autentifikavimo sertifikatą</translation>
-<translation id="8891135217544884558">URL netoliese</translation>
 <translation id="8901170036886848654">Žymių nerasta</translation>
 <translation id="8909135823018751308">Bendrinti…</translation>
 <translation id="8912362522468806198">„Google“ paskyra</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 8e18ceb..02b78c9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Tika konstatēts, ka savienojums ir lēns.</translation>
 <translation id="2842985007712546952">Vecākmape</translation>
 <translation id="2870560284913253234">Vietne</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{Tuvumā noteikts 1 URL}zero{Tuvumā noteikti # URL}one{Tuvumā noteikts # URL}other{Tuvumā noteikti # URL}}</translation>
 <translation id="2888126860611144412">Par Chrome</translation>
 <translation id="2891154217021530873">Pārtraukt lapas ielādi</translation>
 <translation id="2902702728133930130">Pārlūka Chrome palaišanas laikā radās neparedzēta kļūda.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Krātuve</translation>
 <translation id="886510833909353412">Šifrēt visu, izmantojot ieejas frāzi</translation>
 <translation id="8872441722924401214">Autentifikācijas sertifikāta izvēlēšanās</translation>
-<translation id="8891135217544884558">Vietrāži URL no tuvumā esošām ierīcēm</translation>
 <translation id="8901170036886848654">Nav atrasta neviena grāmatzīme</translation>
 <translation id="8909135823018751308">Kopīgot...</translation>
 <translation id="8912362522468806198">Google konts</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 1df53d3..f1a7c96 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Langzame verbinding gedetecteerd.</translation>
 <translation id="2842985007712546952">Bovenliggende map</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL in de buurt}other{# URL's in de buurt}}</translation>
 <translation id="2888126860611144412">Over Chrome</translation>
 <translation id="2891154217021530873">Stoppen met het laden van de pagina</translation>
 <translation id="2902702728133930130">Kan Chrome niet starten door een onverwachte fout.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Opslag</translation>
 <translation id="886510833909353412">Alles versleutelen met wachtwoordzin</translation>
 <translation id="8872441722924401214">Certificaat voor authenticatie kiezen</translation>
-<translation id="8891135217544884558">URL's in de buurt</translation>
 <translation id="8901170036886848654">Geen bladwijzers gevonden</translation>
 <translation id="8909135823018751308">Delen…</translation>
 <translation id="8912362522468806198">Google-account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 1cea764..94be0a1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">En treg tilkobling ble oppdaget.</translation>
 <translation id="2842985007712546952">Overordnet mappe</translation>
 <translation id="2870560284913253234">Nettsted</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 nettadresse i nærheten}other{# nettadresser i nærheten}}</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
 <translation id="2891154217021530873">Stopp innlastingen av siden</translation>
 <translation id="2902702728133930130">Kunne ikke starte Chrome på grunn av en uventet feil.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Lagring</translation>
 <translation id="886510833909353412">Kryptér alle data med en passordfrase</translation>
 <translation id="8872441722924401214">Velg autentiseringssertifikat</translation>
-<translation id="8891135217544884558">Nettadresser i nærheten</translation>
 <translation id="8901170036886848654">Fant ingen bokmerker</translation>
 <translation id="8909135823018751308">Del</translation>
 <translation id="8912362522468806198">Google-konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 8359c54..e4a28f70 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Wykryto wolne połączenie.</translation>
 <translation id="2842985007712546952">Folder nadrzędny</translation>
 <translation id="2870560284913253234">Witryna</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 adres URL w pobliżu}few{# adresy URL w pobliżu}many{# adresów URL w pobliżu}other{# adresu URL w pobliżu}}</translation>
 <translation id="2888126860611144412">Chrome – informacje</translation>
 <translation id="2891154217021530873">Zatrzymaj wczytywanie strony</translation>
 <translation id="2902702728133930130">Podczas uruchamiania Chrome wystąpił nieoczekiwany błąd.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Pamięć</translation>
 <translation id="886510833909353412">Zaszyfruj wszystko za pomocą hasła</translation>
 <translation id="8872441722924401214">Wybierz certyfikat do uwierzytelniania</translation>
-<translation id="8891135217544884558">Adresy URL w pobliżu</translation>
 <translation id="8901170036886848654">Nie znaleziono zakładek</translation>
 <translation id="8909135823018751308">Udostępnij…</translation>
 <translation id="8912362522468806198">Konta Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index 62b121b..4ffada0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Conexão lenta detectada.</translation>
 <translation id="2842985007712546952">Pasta mãe</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL nas proximidades}one{# URLs nas proximidades}other{# URLs nas proximidades}}</translation>
 <translation id="2888126860611144412">Sobre o Google Chrome</translation>
 <translation id="2891154217021530873">Para de carregar a página</translation>
 <translation id="2902702728133930130">O Chrome falhou durante a inicialização devido a um erro inesperado.</translation>
@@ -541,7 +540,6 @@
 <translation id="885701979325669005">Armazenamento</translation>
 <translation id="886510833909353412">Criptografar tudo com senha</translation>
 <translation id="8872441722924401214">Escolher certificado para autenticação</translation>
-<translation id="8891135217544884558">URLs nas proximidades</translation>
 <translation id="8901170036886848654">Nenhum favorito encontrado</translation>
 <translation id="8909135823018751308">Compartilhar...</translation>
 <translation id="8912362522468806198">Conta do Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index b4d94df..7c67eb2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Ligação lenta detetada.</translation>
 <translation id="2842985007712546952">Pasta superior</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL próximo}other{# URLs próximos}}</translation>
 <translation id="2888126860611144412">Acerca do Chrome</translation>
 <translation id="2891154217021530873">Parar carregamento da página</translation>
 <translation id="2902702728133930130">O Chrome falhou durante o arranque com um erro inesperado.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Armazenamento</translation>
 <translation id="886510833909353412">Encriptar todos com frase de acesso</translation>
 <translation id="8872441722924401214">Escolher o certificado para autenticação</translation>
-<translation id="8891135217544884558">URLs próximos</translation>
 <translation id="8901170036886848654">Nenhum marcador encontrado</translation>
 <translation id="8909135823018751308">Partilhar…</translation>
 <translation id="8912362522468806198">Conta Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index 23b03d2..36a9dac4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">A fost detectată o conexiune lentă.</translation>
 <translation id="2842985007712546952">Dosar părinte</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{O adresă URL în apropiere}few{# adrese URL în apropiere}other{# de adrese URL în apropiere}}</translation>
 <translation id="2888126860611144412">Despre Chrome</translation>
 <translation id="2891154217021530873">Oprește încărcarea paginii</translation>
 <translation id="2902702728133930130">Chrome nu a pornit. A apărut o eroare neașteptată.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Stocare</translation>
 <translation id="886510833909353412">Criptează toate datele folosind o expresie de acces</translation>
 <translation id="8872441722924401214">Alegeți certificatul pentru autentificare</translation>
-<translation id="8891135217544884558">Adrese URL din apropiere</translation>
 <translation id="8901170036886848654">Niciun marcaj găsit</translation>
 <translation id="8909135823018751308">Trimiteți…</translation>
 <translation id="8912362522468806198">Contul Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index 592a12a4..237b69c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Низкая скорость сетевого подключения.</translation>
 <translation id="2842985007712546952">Родительская папка</translation>
 <translation id="2870560284913253234">Сайт</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL поблизости}one{# URL поблизости}few{# URL поблизости}many{# URL поблизости}other{# URL поблизости}}</translation>
 <translation id="2888126860611144412">О браузере Chrome</translation>
 <translation id="2891154217021530873">Остановить загрузку страницы</translation>
 <translation id="2902702728133930130">При запуске Chrome произошла непредвиденная ошибка.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Хранилище</translation>
 <translation id="886510833909353412">Шифровать все данные с помощью кодовой фразы</translation>
 <translation id="8872441722924401214">Выберите сертификат</translation>
-<translation id="8891135217544884558">URL поблизости</translation>
 <translation id="8901170036886848654">Ничего не найдено</translation>
 <translation id="8909135823018751308">Поделиться...</translation>
 <translation id="8912362522468806198">Аккаунт Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index af6de37..984fcfca 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Bolo zistené pomalé pripojenie</translation>
 <translation id="2842985007712546952">Nadradený priečinok</translation>
 <translation id="2870560284913253234">Webové stránky</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 webová adresa v okolí}few{# webové adresy v okolí}many{# webovej adresy v okolí}other{# webových adries v okolí}}</translation>
 <translation id="2888126860611144412">Informácie o Google Chrome</translation>
 <translation id="2891154217021530873">Zastaviť načítavanie stránky</translation>
 <translation id="2902702728133930130">Prehliadač Chrome sa nepodarilo spustiť, pretože sa vyskytla neočakávaná chyba</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">Tento účet spravuje doména <ph name="DOMAIN_NAME" />.
 
 Prihlasujete sa pomocou spravovaného účtu a jeho správcovi tak umožňujete úplnú kontrolu nad vaším profilom Chrome. Vaše údaje prehliadača Chrome sa natrvalo prepoja s týmto účtom. Po odpojení tohto účtu sa odstránia miestne údaje prehliadača Chrome.</translation>
+<translation id="3384347053049321195">Zdieľať obrázok</translation>
 <translation id="3410346880900521918">Ak sa vám táto stránka zobrazuje často, skúste použiť tieto <ph name="BEGIN_LINK" />návrhy<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">Veľkosť:</translation>
 <translation id="3485544713029068372">Smart Lock na heslá</translation>
@@ -457,6 +457,9 @@
 <translation id="7648422057306047504">Šifrovať heslá pomocou poverení Google</translation>
 <translation id="7658239707568436148">Zrušiť</translation>
 <translation id="7665369617277396874">Pridať účet</translation>
+<translation id="7735023902678907596">Keď zavriete všetky karty inkognito, po stránkach, ktoré ste na nich zobrazili, nezostane v histórii prehliadania, úložisku súborov cookie a histórii vyhľadávania ani stopa. Stiahnuté súbory a uložené stránky sa však zachovajú.
+
+Nezískavate však úplnú neviditeľnosť. Prejdením do režimu inkognito neskryjete svoje prehliadanie pred zamestnávateľom, poskytovateľom internetových služieb ani pred navštívenými webovými stránkami.</translation>
 <translation id="7761240775244195612">Odstránením <ph name="PAGES_NUMBER" /> offline kópií, ktoré sa minulý mesiac nepoužili, sa uvoľní <ph name="TOTAL_PAGE_SIZE" /> miesta. Chcete ich odstrániť?</translation>
 <translation id="7764225426217299476">Pridať adresu</translation>
 <translation id="7765158879357617694">Presunúť</translation>
@@ -541,7 +544,6 @@
 <translation id="885701979325669005">Úložisko</translation>
 <translation id="886510833909353412">Šifrovať všetko prístupovou frázou</translation>
 <translation id="8872441722924401214">Vyberte certifikát na overenie totožnosti</translation>
-<translation id="8891135217544884558">Webové adresy v okolí</translation>
 <translation id="8901170036886848654">Nenašli sa žiadne záložky</translation>
 <translation id="8909135823018751308">Zdieľať…</translation>
 <translation id="8912362522468806198">účtu Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index b29f450..5d6edb2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Zaznana je počasna povezava.</translation>
 <translation id="2842985007712546952">Nadrejena mapa</translation>
 <translation id="2870560284913253234">Spletno mesto</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL v bližini}one{# URL v bližini}two{# URL-ja v bližini}few{# URL-ji v bližini}other{# URL-jev v bližini}}</translation>
 <translation id="2888126860611144412">O brskalniku Chrome</translation>
 <translation id="2891154217021530873">Ustavi nalaganje strani</translation>
 <translation id="2902702728133930130">Zaradi nepričakovane napake se Chrome ni uspel zagnati.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Shramba</translation>
 <translation id="886510833909353412">Šifriranje z geslom</translation>
 <translation id="8872441722924401214">Izberite potrdilo za preverjanje pristnosti</translation>
-<translation id="8891135217544884558">URL-ji v bližini</translation>
 <translation id="8901170036886848654">Zaznamkov ni bilo mogoče najti</translation>
 <translation id="8909135823018751308">Skupna raba …</translation>
 <translation id="8912362522468806198">Google Račun</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index d455dd4..1f25f91b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Откривена је спора веза.</translation>
 <translation id="2842985007712546952">Надређени директоријум</translation>
 <translation id="2870560284913253234">Сајт</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL у околини}one{# URL у околини}few{# URL-а у околини}other{# URL-ова у околини}}</translation>
 <translation id="2888126860611144412">О Chrome прегледачу</translation>
 <translation id="2891154217021530873">Заустави учитавање странице</translation>
 <translation id="2902702728133930130">Chrome је отказао током покретања због неочекиване грешке.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Складишни простор</translation>
 <translation id="886510833909353412">Шифруј све помоћу приступне фразе</translation>
 <translation id="8872441722924401214">Изаберите сертификат за потврду аутентичности</translation>
-<translation id="8891135217544884558">URL-ови у околини</translation>
 <translation id="8901170036886848654">Није пронађен ниједан обележивач</translation>
 <translation id="8909135823018751308">Дели...</translation>
 <translation id="8912362522468806198">Google налога</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 12b26f9..19e2905 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">En långsam anslutning upptäcktes.</translation>
 <translation id="2842985007712546952">Överordnad mapp</translation>
 <translation id="2870560284913253234">Webbplats</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 webbadress i närheten}other{# webbadresser i närheten}}</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
 <translation id="2891154217021530873">Avbryt inläsningen av sidan</translation>
 <translation id="2902702728133930130">Ett oväntat fel uppstod när Chrome skulle startas.</translation>
@@ -158,6 +157,7 @@
 <translation id="3358663646935160692">Kontot hanteras av <ph name="DOMAIN_NAME" />.
 
 Du loggar in med ett hanterat konto, vilket innebär att administratören kontrollerar din Chrome-profil. Din Chrome-data kommer att knytas permanent till det här kontot. Om du kopplar ifrån det här kontot raderas din lokala Chrome-data.</translation>
+<translation id="3384347053049321195">Dela bild</translation>
 <translation id="3410346880900521918">Om du ser detta ofta provar du <ph name="BEGIN_LINK" />de här förslagen<ph name="END_LINK" />.</translation>
 <translation id="3414952576877147120">Storlek:</translation>
 <translation id="3485544713029068372">Smart Lock för lösenord</translation>
@@ -457,6 +457,9 @@
 <translation id="7648422057306047504">Kryptera lösenord med användaruppgifter för Google</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7665369617277396874">Lägg till konto</translation>
+<translation id="7735023902678907596">Sidor som du visar i inkognitoflikar sparas inte i webbläsarhistoriken och lagras inte bland cookies eller i sökhistoriken när du har stängt alla inkognitoflikar. Däremot sparas alla nedladdade filer och sparade sidor.
+
+Du är dock inte osynlig. Trots inkognitoläget kan din arbetsgivare, din internetleverantör eller de webbplatser du besöker se din aktivitet.</translation>
 <translation id="7761240775244195612">Vill du radera <ph name="PAGES_NUMBER" /> offlinekopior som du inte har använt under den senaste månaden? Ett utrymme på <ph name="TOTAL_PAGE_SIZE" /> rensas.</translation>
 <translation id="7764225426217299476">Lägg till adress</translation>
 <translation id="7765158879357617694">Flytta</translation>
@@ -543,7 +546,6 @@
 <translation id="885701979325669005">Lagring</translation>
 <translation id="886510833909353412">Kryptera alla data med en lösenfras</translation>
 <translation id="8872441722924401214">Välj certifikat för autentisering</translation>
-<translation id="8891135217544884558">Närliggande webbadresser</translation>
 <translation id="8901170036886848654">Inga bokmärken hittades</translation>
 <translation id="8909135823018751308">Dela …</translation>
 <translation id="8912362522468806198">Google-konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 0d846e72..c9022f0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Kasi ya chini ya muunganisho imegunduliwa.</translation>
 <translation id="2842985007712546952">Folda kuu</translation>
 <translation id="2870560284913253234">Tovuti</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{URL 1 ya karibu}other{URL # za karibu}}</translation>
 <translation id="2888126860611144412">Kuhusu Chrome</translation>
 <translation id="2891154217021530873">Simamisha upakiaji wa ukurasa</translation>
 <translation id="2902702728133930130">Chrome haikufaulu wakati wa kuanza kutokana na hitilafu isiyotarajiwa.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Hifadhi</translation>
 <translation id="886510833909353412">Simba yote kwa njia fiche kwa kaulisiri</translation>
 <translation id="8872441722924401214">Chagua cheti cha kuthibitishia</translation>
-<translation id="8891135217544884558">URL za Karibu</translation>
 <translation id="8901170036886848654">Hakuna alamisho zilizopatikana</translation>
 <translation id="8909135823018751308">Shiriki...</translation>
 <translation id="8912362522468806198">Akaunti ya Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 3a93711..626f4a6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">ตรวจพบการเชื่อมต่อที่ช้า</translation>
 <translation id="2842985007712546952">โฟลเดอร์ระดับบนสุด</translation>
 <translation id="2870560284913253234">เว็บไซต์</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{มี 1 URL อยู่ใกล้เคียง}other{มี # URL อยู่ใกล้เคียง}}</translation>
 <translation id="2888126860611144412">เกี่ยวกับ Chrome</translation>
 <translation id="2891154217021530873">หยุดการโหลดหน้า</translation>
 <translation id="2902702728133930130">Chrome ล้มเหลวในระหว่างเริ่มต้นเนื่องจากข้อผิดพลาดที่ไม่คาดคิด</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">พื้นที่เก็บข้อมูล</translation>
 <translation id="886510833909353412">เข้ารหัสทั้งหมดด้วยรหัสผ่าน</translation>
 <translation id="8872441722924401214">เลือกใบรับรองสำหรับการตรวจสอบสิทธิ์</translation>
-<translation id="8891135217544884558">URL ใกล้เคียง</translation>
 <translation id="8901170036886848654">ไม่พบบุ๊กมาร์ก</translation>
 <translation id="8909135823018751308">แชร์…</translation>
 <translation id="8912362522468806198">บัญชี Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 00967cc7..9ca1240 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Yavaş bağlantı algılandı.</translation>
 <translation id="2842985007712546952">Ana klasör</translation>
 <translation id="2870560284913253234">Site</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{Yakınlarda 1 URL}other{Yakınlarda # URL}}</translation>
 <translation id="2888126860611144412">Chrome hakkında</translation>
 <translation id="2891154217021530873">Sayfa yüklemeyi durdur</translation>
 <translation id="2902702728133930130">Chrome başlatılırken beklenmeyen bir hata yüzünden başarısız oldu.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Depolama</translation>
 <translation id="886510833909353412">Tümünü parola ile şifrele</translation>
 <translation id="8872441722924401214">Kimlik doğrulama sertifikasını seçin</translation>
-<translation id="8891135217544884558">Yakındaki URL'ler</translation>
 <translation id="8901170036886848654">Yer işareti bulunamadı</translation>
 <translation id="8909135823018751308">Paylaş…</translation>
 <translation id="8912362522468806198">Google Hesabı</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index 44c8eee..7dd25ec 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Виявлено повільне з’єднання.</translation>
 <translation id="2842985007712546952">Батьківська папка</translation>
 <translation id="2870560284913253234">Сайт</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL-адреса поруч}one{# URL-адреса поруч}few{# URL-адреси поруч}many{# URL-адрес поруч}other{# URL-адреси поруч}}</translation>
 <translation id="2888126860611144412">Про Chrome</translation>
 <translation id="2891154217021530873">Припинити завантаження сторінки</translation>
 <translation id="2902702728133930130">Не вдалося запустити Chrome через неочікувану помилку.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Обсяг пам’яті</translation>
 <translation id="886510833909353412">Шифрувати все парольною фразою</translation>
 <translation id="8872441722924401214">Виберіть сертифікат для автентифікації</translation>
-<translation id="8891135217544884558">URL-адреси з пристроїв поблизу</translation>
 <translation id="8901170036886848654">Немає закладок</translation>
 <translation id="8909135823018751308">Надіслати…</translation>
 <translation id="8912362522468806198">Обліковий запис Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 09b8011f..3f967ae 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">Đã phát hiện kết nối chậm.</translation>
 <translation id="2842985007712546952">Thư mục gốc</translation>
 <translation id="2870560284913253234">Trang web</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{1 URL lân cận}other{# URL lân cận}}</translation>
 <translation id="2888126860611144412">Giới thiệu Chrome</translation>
 <translation id="2891154217021530873">Ngừng tải trang</translation>
 <translation id="2902702728133930130">Chrome khởi động không thành công với lỗi không mong muốn.</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">Dung lượng</translation>
 <translation id="886510833909353412">Mã hóa tất cả bằng cụm mật khẩu</translation>
 <translation id="8872441722924401214">Chọn chứng chỉ để xác thực</translation>
-<translation id="8891135217544884558">URL lân cận</translation>
 <translation id="8901170036886848654">Không tìm thấy dấu trang</translation>
 <translation id="8909135823018751308">Chia sẻ...</translation>
 <translation id="8912362522468806198">Tài khoản Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index dd29ff86a..31f404bed 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">检测到网速很慢。</translation>
 <translation id="2842985007712546952">父文件夹</translation>
 <translation id="2870560284913253234">网站</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{附近有 1 个网址}other{附近有 # 个网址}}</translation>
 <translation id="2888126860611144412">关于 Chrome</translation>
 <translation id="2891154217021530873">停止加载网页</translation>
 <translation id="2902702728133930130">由于出现意外错误,Chrome 启动失败。</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">存储空间</translation>
 <translation id="886510833909353412">使用密码加密所有同步数据</translation>
 <translation id="8872441722924401214">选择用于验证身份的证书</translation>
-<translation id="8891135217544884558">附近设备播报的网址</translation>
 <translation id="8901170036886848654">未找到任何书签</translation>
 <translation id="8909135823018751308">分享…</translation>
 <translation id="8912362522468806198">Google 帐户</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index a215c64..4f5c39a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -119,7 +119,6 @@
 <translation id="2816165854387457183">偵測到連線速度緩慢。</translation>
 <translation id="2842985007712546952">上層資料夾</translation>
 <translation id="2870560284913253234">網站</translation>
-<translation id="2873598956318269337">{NUM_URLS,plural, =1{附近有 1 個網址}other{附近有 # 個網址}}</translation>
 <translation id="2888126860611144412">關於 Chrome</translation>
 <translation id="2891154217021530873">停止載入網頁</translation>
 <translation id="2902702728133930130">發生未預期的錯誤,Chrome 啟動失敗。</translation>
@@ -543,7 +542,6 @@
 <translation id="885701979325669005">儲存空間</translation>
 <translation id="886510833909353412">使用通關密語將所有資料加密</translation>
 <translation id="8872441722924401214">選擇用於驗證的憑證</translation>
-<translation id="8891135217544884558">附近裝置播送的網址</translation>
 <translation id="8901170036886848654">找不到書籤</translation>
 <translation id="8909135823018751308">分享…</translation>
 <translation id="8912362522468806198">Google 帳戶</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherServiceTest.java
index cb647b6e..7d7304c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherServiceTest.java
@@ -45,16 +45,11 @@
     protected void setUp() throws Exception {
         mContext = new AdvancedMockContext(getInstrumentation().getTargetContext());
         BackgroundSyncLauncher.setGCMEnabled(false);
+        BackgroundSyncLauncher.setReportingDisabledForTests(true);
         mLauncher = BackgroundSyncLauncher.create(mContext);
         mLauncherService = new MockLauncherService();
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        BackgroundSyncLauncher.setGCMEnabled(true);
-        super.tearDown();
-    }
-
     private void deleteLauncherInstance() {
         mLauncher.destroy();
         mLauncher = null;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherTest.java
index e78eea2..6ff4e78b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/BackgroundSyncLauncherTest.java
@@ -25,15 +25,10 @@
     protected void setUp() throws Exception {
         mContext = new AdvancedMockContext(getInstrumentation().getTargetContext());
         BackgroundSyncLauncher.setGCMEnabled(false);
+        BackgroundSyncLauncher.setReportingDisabledForTests(true);
         mLauncher = BackgroundSyncLauncher.create(mContext);
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        BackgroundSyncLauncher.setGCMEnabled(true);
-        super.tearDown();
-    }
-
     private void deleteLauncherInstance() {
         mLauncher.destroy();
         mLauncher = null;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index 16dc455..5f0b8bc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -1516,8 +1516,8 @@
     @SmallTest
     @Feature({"ContextualSearch"})
     @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE})
-    @CommandLineFlags.Add(ContextualSearchFieldTrial.TAP_RESOLVE_LIMIT_FOR_DECIDED + "=2")
     public void testTapResolveLimitForDecided() throws InterruptedException, TimeoutException {
+        mPolicy.setTapResolveLimitForDecidedForTesting(2);
         clickToTriggerSearchTermResolution();
         assertSearchTermRequested();
         clickToTriggerSearchTermResolution();
@@ -1540,8 +1540,8 @@
     @SmallTest
     @Feature({"ContextualSearch"})
     @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE})
-    @CommandLineFlags.Add(ContextualSearchFieldTrial.TAP_RESOLVE_LIMIT_FOR_UNDECIDED + "=2")
     public void testTapResolveLimitForUndecided() throws InterruptedException, TimeoutException {
+        mPolicy.setTapResolveLimitForUndecidedForTesting(2);
         mPolicy.overrideDecidedStateForTesting(false);
 
         clickToTriggerSearchTermResolution();
@@ -1566,8 +1566,8 @@
     @SmallTest
     @Feature({"ContextualSearch"})
     @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE})
-    @CommandLineFlags.Add(ContextualSearchFieldTrial.TAP_PREFETCH_LIMIT_FOR_DECIDED + "=2")
     public void testTapPrefetchLimitForDecided() throws InterruptedException, TimeoutException {
+        mPolicy.setTapPrefetchLimitForDecidedForTesting(2);
         clickToTriggerPrefetch();
         assertLoadedLowPriorityUrl();
         clickToTriggerPrefetch();
@@ -1590,8 +1590,8 @@
     @SmallTest
     @Feature({"ContextualSearch"})
     @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE})
-    @CommandLineFlags.Add(ContextualSearchFieldTrial.TAP_PREFETCH_LIMIT_FOR_UNDECIDED + "=2")
     public void testTapPrefetchLimitForUndecided() throws InterruptedException, TimeoutException {
+        mPolicy.setTapPrefetchLimitForUndecidedForTesting(2);
         mPolicy.overrideDecidedStateForTesting(false);
 
         clickToTriggerPrefetch();
@@ -1665,9 +1665,9 @@
      * @Feature({"ContextualSearch"})
      */
     @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
-    @CommandLineFlags.Add(ContextualSearchFieldTrial.TAP_PREFETCH_LIMIT_FOR_DECIDED + "=2")
     @FlakyTest
     public void testDisembodiedBar() throws InterruptedException, TimeoutException {
+        mPolicy.setTapPrefetchLimitForDecidedForTesting(2);
         clickToTriggerPrefetch();
         assertLoadedLowPriorityUrl();
         clickToTriggerPrefetch();
@@ -2098,11 +2098,11 @@
      * of selection bounds, so this helps prevent a regression with that.
      */
     @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
-    @CommandLineFlags.Add({ContextualSearchFieldTrial.TAP_RESOLVE_LIMIT_FOR_DECIDED + "=200",
-            ContextualSearchFieldTrial.TAP_RESOLVE_LIMIT_FOR_UNDECIDED + "=200",
-            ContextualSearchFieldTrial.TAP_PREFETCH_LIMIT_FOR_DECIDED + "=200",
-            ContextualSearchFieldTrial.TAP_PREFETCH_LIMIT_FOR_UNDECIDED + "=200"})
     public void testTapALot() throws InterruptedException, TimeoutException {
+        mPolicy.setTapPrefetchLimitForDecidedForTesting(200);
+        mPolicy.setTapResolveLimitForDecidedForTesting(200);
+        mPolicy.setTapPrefetchLimitForUndecidedForTesting(200);
+        mPolicy.setTapResolveLimitForUndecidedForTesting(200);
         for (int i = 0; i < 50; i++) {
             clickToTriggerSearchTermResolution();
             waitForSelectionDissolved();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
index f1192fac..b0bed12 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
@@ -152,16 +152,6 @@
             mCalendar.set(Calendar.YEAR, 2014);
             mCalendar.set(Calendar.DAY_OF_YEAR, 14);
         }
-
-        @Override
-        protected int getCurrentDay() {
-            return super.getCurrentDay(mCalendar);
-        }
-
-        @Override
-        protected int getFirstDayOfCurrentWeek() {
-            return super.getFirstDayOfCurrentWeek(mCalendar);
-        }
     }
 
     private void createMinidumpFile() throws Exception {
@@ -223,45 +213,7 @@
 
     @SmallTest
     @Feature({"Android-AppBase"})
-    public void testCrashUploadSizeConstraints() throws Exception {
-        CrashReportingPermissionManager testPermManager =
-                new MockCrashReportingPermissionManager(true, true);
-
-        HttpURLConnectionFactory httpURLConnectionFactory = new TestHttpURLConnectionFactory();
-        extendUploadFile(MinidumpUploadCallable.LOG_SIZE_LIMIT_BYTES);
-
-        MinidumpUploadCallable minidumpUploadCallable =
-                new MockMinidumpUploadCallable(httpURLConnectionFactory, testPermManager);
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay(),
-                MinidumpUploadCallable.LOG_UPLOAD_LIMIT_PER_DAY - 1,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek(), 0);
-        assertEquals(MinidumpUploadCallable.UPLOAD_FAILURE,
-                minidumpUploadCallable.call().intValue());
-        assertFalse(mExpectedFileAfterUpload.exists());
-    }
-
-    @SmallTest
-    @Feature({"Android-AppBase"})
-    public void testCrashUploadSizeNotLimited() throws Exception {
-        CrashReportingPermissionManager testPermManager =
-                new MockCrashReportingPermissionManager(true, false);
-
-        HttpURLConnectionFactory httpURLConnectionFactory = new TestHttpURLConnectionFactory();
-        extendUploadFile(MinidumpUploadCallable.LOG_SIZE_LIMIT_BYTES);
-
-        MinidumpUploadCallable minidumpUploadCallable =
-                new MockMinidumpUploadCallable(httpURLConnectionFactory, testPermManager);
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay(),
-                MinidumpUploadCallable.LOG_UPLOAD_LIMIT_PER_DAY - 1,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek(), 0);
-        assertEquals(MinidumpUploadCallable.UPLOAD_SUCCESS,
-                minidumpUploadCallable.call().intValue());
-        assertTrue(mExpectedFileAfterUpload.exists());
-    }
-
-    @SmallTest
-    @Feature({"Android-AppBase"})
-    public void testCrashUploadFrequencyConstraints() throws Exception {
+    public void testCrashUploadConstrainted() throws Exception {
         CrashReportingPermissionManager testPermManager =
                 new MockCrashReportingPermissionManager(true, true);
 
@@ -269,69 +221,9 @@
 
         MinidumpUploadCallable minidumpUploadCallable =
                 new MockMinidumpUploadCallable(httpURLConnectionFactory, testPermManager);
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay(),
-                MinidumpUploadCallable.LOG_UPLOAD_LIMIT_PER_DAY,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek(), 0);
         assertEquals(MinidumpUploadCallable.UPLOAD_FAILURE,
                 minidumpUploadCallable.call().intValue());
         assertFalse(mExpectedFileAfterUpload.exists());
-
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay(),
-                MinidumpUploadCallable.LOG_UPLOAD_LIMIT_PER_DAY - 1,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek(), 0);
-        assertEquals(MinidumpUploadCallable.UPLOAD_SUCCESS,
-                minidumpUploadCallable.call().intValue());
-        assertTrue(mExpectedFileAfterUpload.exists());
-
-        // After a successful upload we need to the create upload file again.
-        createMinidumpFile();
-
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay() - 1,
-                MinidumpUploadCallable.LOG_UPLOAD_LIMIT_PER_DAY,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek(), 0);
-        assertEquals(MinidumpUploadCallable.UPLOAD_SUCCESS,
-                minidumpUploadCallable.call().intValue());
-        assertTrue(mExpectedFileAfterUpload.exists());
-    }
-
-    @SmallTest
-    @Feature({"Android-AppBase"})
-    public void testCrashUploadWeeklyConstraints() throws Exception {
-        CrashReportingPermissionManager testPermManager =
-                new MockCrashReportingPermissionManager(true, true);
-
-        HttpURLConnectionFactory httpURLConnectionFactory = new TestHttpURLConnectionFactory();
-
-        MinidumpUploadCallable minidumpUploadCallable =
-                new MockMinidumpUploadCallable(httpURLConnectionFactory, testPermManager);
-        int fileSize = MinidumpUploadCallable.LOG_SIZE_LIMIT_BYTES / 10;
-        extendUploadFile(fileSize);
-        // This shouldn't work as weekly size cannot allow one more |fileSize| upload.
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay(), 2,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek(),
-                MinidumpUploadCallable.LOG_WEEKLY_SIZE_LIMIT_BYTES - fileSize / 2);
-        assertEquals(MinidumpUploadCallable.UPLOAD_FAILURE,
-                minidumpUploadCallable.call().intValue());
-        assertFalse(mExpectedFileAfterUpload.exists());
-
-        // This upload should be allowed although there is not enough weekly limit left, because as
-        // the week changes the weekly limit should get reset.
-        setUpCrashPreferences(minidumpUploadCallable.getCurrentDay() - 1,
-                MinidumpUploadCallable.LOG_UPLOAD_LIMIT_PER_DAY - 1,
-                minidumpUploadCallable.getFirstDayOfCurrentWeek() - 7,
-                MinidumpUploadCallable.LOG_WEEKLY_SIZE_LIMIT_BYTES - fileSize / 2);
-        assertEquals(MinidumpUploadCallable.UPLOAD_SUCCESS,
-                minidumpUploadCallable.call().intValue());
-        assertTrue(mExpectedFileAfterUpload.exists());
-
-        // After a successful upload we need to create the upload file again.
-        createMinidumpFile();
-        extendUploadFile(fileSize);
-
-        // This upload should be allowed as there is enough weekly limit left.
-        assertEquals(MinidumpUploadCallable.UPLOAD_SUCCESS,
-                minidumpUploadCallable.call().intValue());
-        assertTrue(mExpectedFileAfterUpload.exists());
     }
 
     private void setUpCrashPreferences(int lastDay, int count, int lastWeek, long totalSize) {
diff --git a/chrome/app/DEPS b/chrome/app/DEPS
index 14c8861..cd3a112 100644
--- a/chrome/app/DEPS
+++ b/chrome/app/DEPS
@@ -19,7 +19,7 @@
   "+components/nacl/renderer/plugin/ppapi_entrypoints.h",
   "+components/nacl/zygote",
   "+components/policy/core/browser/android",
-  "+components/startup_metric_utils",
+  "+components/startup_metric_utils/browser",
   "+components/upload_list",
   "+components/version_info",
   "+content/public/app",
diff --git a/chrome/app/android/chrome_main_delegate_android.cc b/chrome/app/android/chrome_main_delegate_android.cc
index dec88e9c..f4440ca 100644
--- a/chrome/app/android/chrome_main_delegate_android.cc
+++ b/chrome/app/android/chrome_main_delegate_android.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/android/metrics/uma_utils.h"
 #include "chrome/browser/media/android/remote/remote_media_player_manager.h"
 #include "components/policy/core/browser/android/android_combined_policy_provider.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "content/browser/media/android/browser_media_player_manager.h"
 #include "content/public/browser/browser_main_runner.h"
 
diff --git a/chrome/app/chrome_exe_main_win.cc b/chrome/app/chrome_exe_main_win.cc
index d26676fe..a5f8ee1 100644
--- a/chrome/app/chrome_exe_main_win.cc
+++ b/chrome/app/chrome_exe_main_win.cc
@@ -21,7 +21,7 @@
 #include "chrome/common/chrome_paths_internal.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome_elf/chrome_elf_main.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "content/public/common/result_codes.h"
 #include "ui/gfx/win/dpi.h"
 
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index b6c7bac..cb27994b 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -40,7 +40,6 @@
 #include "chrome/utility/chrome_content_utility_client.h"
 #include "components/component_updater/component_updater_paths.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
 #include "components/version_info/version_info.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_paths.h"
@@ -126,6 +125,10 @@
 #include "pdf/pdf.h"
 #endif
 
+#if !defined(CHROME_MULTIPLE_DLL_CHILD)
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
+#endif
+
 #if !defined(CHROME_MULTIPLE_DLL_BROWSER)
 #include "chrome/child/pdf_child_init.h"
 
@@ -403,9 +406,8 @@
 }
 #endif
 
-}  // namespace
-
-ChromeMainDelegate::ChromeMainDelegate() {
+#if !defined(CHROME_MULTIPLE_DLL_CHILD)
+void RecordMainStartupMetrics() {
 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
   // Record the startup process creation time on supported platforms.
   startup_metric_utils::RecordStartupProcessCreationTime(
@@ -421,6 +423,19 @@
   startup_metric_utils::RecordMainEntryPointTime(base::Time::Now());
 #endif
 }
+#endif  // !defined(CHROME_MULTIPLE_DLL_CHILD)
+
+}  // namespace
+
+ChromeMainDelegate::ChromeMainDelegate() {
+#if !defined(CHROME_MULTIPLE_DLL_CHILD)
+  // Record startup metrics in the browser process. For component builds, there
+  // is no way to know the type of process (process command line is not yet
+  // initialized), so the function below will also be called in renderers.
+  // This doesn't matter as it simply sets global variables.
+  RecordMainStartupMetrics();
+#endif  // !defined(CHROME_MULTIPLE_DLL_CHILD)
+}
 
 ChromeMainDelegate::~ChromeMainDelegate() {
 }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 9ba7401..94319662 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -1832,11 +1832,12 @@
         </message>
         <message name="IDS_DOWNLOAD_NOTIFICATION_STATUS"
                  desc="Size and units downloaded and total, the origin domain, and the current status od download.">
-          <ph name="DOWNLOAD_RECEIVED_AND_TOTAL">$1<ex>54/154 MB</ex></ph> from <ph name="DOWNLOAD_DOMAIN">$2<ex>example.com</ex></ph>, <ph name="SUB_STATUS_TEXT">$3<ex>24 secs remaining</ex></ph>
+          <ph name="DOWNLOAD_RECEIVED_AND_TOTAL">$1<ex>54/154 MB</ex></ph>, <ph name="SUB_STATUS_TEXT">$2<ex>24 secs remaining</ex></ph>
+From <ph name="DOWNLOAD_DOMAIN">$3<ex>example.com</ex></ph>
         </message>
         <message name="IDS_DOWNLOAD_NOTIFICATION_STATUS_COMPLETED"
                  desc="Size and units downloaded, and the origin domain.">
-          <ph name="DOWNLOAD_RECEIVED_AND_TOTAL">$1<ex>154/154 MB</ex></ph> from <ph name="DOWNLOAD_DOMAIN">$2<ex>example.com</ex></ph>
+          <ph name="DOWNLOAD_RECEIVED">$1<ex>154 MB</ex></ph> from <ph name="DOWNLOAD_DOMAIN">$2<ex>example.com</ex></ph>
         </message>
       </if>
       <message name="IDS_DOWNLOAD_STATUS_IN_PROGRESS"
@@ -4616,11 +4617,20 @@
         <message name="IDS_MD_EXTENSIONS_SEARCH" desc="The text displayed in the search box on the chrome://extensions page.">
           Search
         </message>
+        <message name="IDS_MD_EXTENSIONS_SIDEBAR_APPS" desc="The text displayed in the sidebar to go to the apps section of the page.">
+          Chrome Apps
+        </message>
         <message name="IDS_MD_EXTENSIONS_SIDEBAR_EXTENSIONS" desc="The text displayed in the sidebar to go to the extensions section of the page.">
           Extensions
         </message>
-        <message name="IDS_MD_EXTENSIONS_SIDEBAR_APPS" desc="The text displayed in the sidebar to go to the apps section of the page.">
-          Chrome Apps
+        <message name="IDS_MD_EXTENSIONS_SIDEBAR_LOAD_UNPACKED" desc="The text displayed in the sidebar to load unpacked extensions.">
+          Load unpacked extensions
+        </message>
+        <message name="IDS_MD_EXTENSIONS_SIDEBAR_PACK" desc="The text displayed in the sidebar to pack an extension directory.">
+          Pack extensions...
+        </message>
+        <message name="IDS_MD_EXTENSIONS_SIDEBAR_UPDATE_NOW" desc="The text displayed in the sidebar to update existing extensions now.">
+          Update extensions now
         </message>
         <message name="IDS_MD_EXTENSIONS_SIDEBAR_WEBSITES" desc="The text displayed in the sidebar to go to the websites section of the page.">
           Websites
@@ -7716,6 +7726,40 @@
          =1 {1}
          other {#}}
       </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_EMPTY" desc="A counter showing that the user has no form data stored.">
+        none
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_CREDIT_CARDS" desc="A counter showing how many credit cards the user has.">
+        {COUNT, plural,
+         =1 {1 credit card}
+         other {# credit cards}}
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_ADDRESSES" desc="A counter showing how many addresses the user has.">
+        {COUNT, plural,
+         =1 {1 address}
+         other {# addresses}}
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS" desc="A counter showing how many form autocompletion suggestions the user has.">
+        {COUNT, plural,
+         =1 {1 suggestion}
+         other {# suggestions}}
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_LONG" desc="A counter showing how many other form autocompletion suggestions the user has. Note that this message is shown at the end of an enumeration of form data types, such as '2 addresses, 5 others suggestions'.">
+        {COUNT, plural,
+         =1 {1 other suggestion}
+         other {# other suggestions}}
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_SHORT" desc="A counter showing how many other items of form data the user has. Note that this message is shown at the end of an enumeration of form data types, such as '3 credit cards, 2 addresses, 5 others'.">
+        {COUNT, plural,
+         =1 {1 other}
+         other {# others}}
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_TWO_TYPES" desc="A counter showing that the user has two types of form data. The types and their counts will be substituted, this message only provides the comma separator.">
+        <ph name="TYPE_1">$1<ex>2 credit cards</ex></ph>, <ph name="TYPE_2">$2<ex>1 address</ex></ph>
+      </message>
+      <message name="IDS_DEL_AUTOFILL_COUNTER_THREE_TYPES" desc="A counter showing that the user has three types of form data. The types and their counts will be substituted, this message only provides the comma separators.">
+        <ph name="TYPE_1">$1<ex>2 credit cards</ex></ph>, <ph name="TYPE_2">$2<ex>1 address</ex></ph>, <ph name="TYPE_3">$3<ex>5 others</ex></ph>
+      </message>
 
       <!-- Supervised User (Legacy and Accounts for Kids) Avatar Menu -->
       <message name="IDS_LEGACY_SUPERVISED_USER_INFO" desc="Text which explains that a supervised user is managed by a custodian.">
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index 9f830d9..2b66347 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -34,6 +34,7 @@
 <translation id="1967743265616885482">ተመሳሳይ ስም ያለው ሞዱል ከChromium ጋር የሚጋጭ መሆኑ ይታወቃል።</translation>
 <translation id="2077129598763517140">ሲገኝ የሃርድዌር ማጣደፍን ተጠቀም</translation>
 <translation id="2097986737970966220">ዴስክቶፕ ላይ Chromiumን ክፈት</translation>
+<translation id="2117181891440368863"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chromium አረጋግጧል። አገልጋዩ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል፣ ሆኖም ግን ልክ ያልሆነ ነበር።</translation>
 <translation id="2119636228670142020">&amp;ስለChromium ስርዓተ ክወና</translation>
 <translation id="2158734852934720349">Chromium OS የክፍት ምንጭ ፈቃዶች</translation>
 <translation id="2233513990531887259">በChromium አስማጭ ሁነታ ውስጥ ዳግም አስጀምር</translation>
@@ -179,6 +180,7 @@
 <translation id="6734080038664603509">&amp;Chromiumን አዘምን</translation>
 <translation id="6757767188268205357">አታርመኝ</translation>
 <translation id="6810143991807788455">የአሁኖቹ ቅንብሮችን ሪፖርት በማድረግ Chromium የተሻለ እንዲሆን ያግዙ</translation>
+<translation id="6838494703713445896"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chromium አረጋግጧል። አገልጋዩ ልክ የሆነ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል።</translation>
 <translation id="6883876366448858277">አንድ ቃል እና በዙሪያው ያለውን አውድ ለGoogle ፍለጋ ይልካል፣ እና ትርጓሜዎችን፣ ስዕሎችን፣ እና ሌሎች የፍለጋ ውጤቶችን ይመልሳል።</translation>
 <translation id="6893813176749746474">Chromium ተዘምኗል፣ ግን ቢያንስ ለ30 ቀኖች አልተጠቀሙበትም።</translation>
 <translation id="6900895776413482243">በChromium አስማጭ ሁነታ ዳግም ማስጀመር የChromium መተግበሪያዎችዎን ዘግቶ ዳግም ያስጀምራቸዋል።</translation>
@@ -191,6 +193,7 @@
 <translation id="7066436765290594559">Chromium OS የእርስዎን ውሂብ ማመሳሰል አልቻለም። የእርስዎን የማመሳሰያ የይለፍ ሐረግ እባክዎ ያዘምኑ።</translation>
 <translation id="7138853919861947730">Chromium የማሰስ ተሞክሮዎን ለማሻሻል የድር አገልግሎቶችን ሊጠቀም ይችላል።</translation>
 <translation id="7162152143154757523">Chromium አሳሹ ላይ የሚተይቡትን ለGoogle አገልጋዮች በመላክ ይበልጥ አዋቂ የሆነ ፊደል አራሚ ሊያቀርብልዎት ይችላል፣ ይህም Google ፍለጋ የሚጠቀመውን ተመሳሳዩ የፊደል አራሚ ቴክኖሎጂ እንዲጠቀሙ ያስችልዎታል።</translation>
+<translation id="7178626992616222740"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chromium አረጋግጧል። አገልጋዩ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል፣ ሆኖም ግን Chromium ማንኛውንም የምስክር ወረቀት ግልፅነት ምዝግብ ማስታወሻዎችን አያውቅም።</translation>
 <translation id="7196020411877309443">ለምን ይህን አያለሁ?</translation>
 <translation id="7205698830395646142">በChromium ምናሌ ውስጥ ደብቅ</translation>
 <translation id="7211828883345145708">Chromiumን ለማረም የሚጠቅሙ ተጨማሪ የቁልፍ ሰሌዳ አቋራጮችን ያነቃል።</translation>
@@ -216,6 +219,7 @@
 <translation id="7723128346970903111">ሲነቃ በiframe ላይ የተመሠረተ የChromium መግቢያ ፍሰትን ይፈጥራል፤ አለበለዚያ በድር እይታ ላይ የተመሰረተ ፍሰትን ይጠቀማል።</translation>
 <translation id="7729447699958282447">ማመሳሰል ለጎራዎ ስለማይገኝ Chromium ውሂብዎን ማመሳሰል አይችልም።</translation>
 <translation id="7747138024166251722">ጫኝው ጊዜያዊ ማውጫ መፍጠር አልቻለም። እባክዎ ነፃ የዲስክ ቦታ እና ሶፍትዌር የመጫን ፍቃድ እንዳለ ይፈትሹ።</translation>
+<translation id="7918535023914021398"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chromium አረጋግጧል። አገልጋዩ ማንኛውንም የምስክር ወረቀት ግልፅነት መረጃን አላቀረበም።</translation>
 <translation id="7937630085815544518">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ወደ Chromium ገብተዋል። እባክዎ እንደገና ለመግባት ተመሳሳዩን መለያ ይጠቀሙ።</translation>
 <translation id="7962572577636132072">Chromium በራስ-ሰር ይዘመናል፣ ስለዚህ ሁልጊዜ አዲሱ ስሪት ይኖርዎታል።</translation>
 <translation id="7979877361127045932">በChromium ምናሌ ውስጥ ደብቅ</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index 3fe68d1..799aba25 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -32,6 +32,7 @@
 <translation id="1967743265616885482">‏هناك وحدة تحمل الاسم نفسه ومعروف أنها تتعارض مع Chromium.</translation>
 <translation id="2077129598763517140">استخدام تسريع الأجهزة عند توفره</translation>
 <translation id="2097986737970966220">‏فتح Chromium على سطح المكتب</translation>
+<translation id="2117181891440368863">‏تحقق Chromium من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة، ولكنها غير صالحة.</translation>
 <translation id="2119636228670142020">‏حول ن&amp;ظام التشغيل Chromium</translation>
 <translation id="2158734852934720349">‏تراخيص مفتوحة المصدر لنظام التشغيل Chromium</translation>
 <translation id="2233513990531887259">‏إعادة التشغيل في وضع Chromium المجسم</translation>
@@ -178,6 +179,7 @@
 <translation id="6734080038664603509">‏تح&amp;ديث Chromium</translation>
 <translation id="6757767188268205357">عدم المطالبة مرة أخرى</translation>
 <translation id="6810143991807788455">‏ساعد في تحسين Chromium بالإبلاغ عن الإعدادات الحالية</translation>
+<translation id="6838494703713445896">‏تحقق Chromium من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة الصالحة.</translation>
 <translation id="6883876366448858277">‏إرسال الكلمة والسياق المحيط بها إلى بحث Google وعرض التعريفات والصور ونتائج البحث الأخرى.</translation>
 <translation id="6893813176749746474">‏تم تحديث متصفح Chromium، ولكنك لم تستخدمه منذ أكثر من 30 يومًا.</translation>
 <translation id="6900895776413482243">‏ستؤدي إعادة التشغيل في وضع Chromium المجسم إلى إغلاق تطبيقات Chromium وإعادة تشغيلها.</translation>
@@ -190,6 +192,7 @@
 <translation id="7066436765290594559">‏تعذر على نظام التشغيل Chromium مزامنة البيانات. الرجاء تحديث عبارة مرور المزامنة.</translation>
 <translation id="7138853919861947730">‏قد يستخدم Chromium خدمات الويب لتحسين تجربة التصفح لديك.</translation>
 <translation id="7162152143154757523">‏يمكن أن يقدم Chromium تدقيقًا إملائيًا أكثر دقة من خلال إرسال ما تكتبه في المتصفح إلى خوادم Google، مما يتيح لك استخدام تقنية التدقيق الإملائي ذاتها المستخدمة في بحث Google.</translation>
+<translation id="7178626992616222740">‏تحقق Chromium من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة، ولكن لم يتعرّفChromium على أي سجلات لشفافية الشهادة.</translation>
 <translation id="7196020411877309443">لماذا أرى مربع الحوار هذا؟</translation>
 <translation id="7205698830395646142">‏الإخفاء في قائمة Chromium</translation>
 <translation id="7211828883345145708">‏لتمكين اختصارات لوحة مفاتيح إضافية والتي تكون مفيدة لتصحيح أخطاء Chromium.</translation>
@@ -215,6 +218,7 @@
 <translation id="7723128346970903111">‏عند تمكينه، سيستخدم تدفق تسجيل دخول Chromium القائم على iframe؛ وإلا سيستخدم تدفقًا قائمًا على عرض الويب.</translation>
 <translation id="7729447699958282447">‏تعذر على Chromium مزامنة البيانات نظرًا لأن المزامنة غير متاحة في نطاقك.</translation>
 <translation id="7747138024166251722">تعذر على أداة المثبِّت إنشاء دليل مؤقت. يُرجى التحقق من وجود مساحة خالية على القرص وتوفر الإذن اللازم لتثبيت البرنامج.</translation>
+<translation id="7918535023914021398">‏تحقق Chromium من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. ولم يقدم الخادم أي معلومات لشفافية الشهادة.</translation>
 <translation id="7937630085815544518">‏تم تسجيل دخولك إلى Chromium باعتبارك <ph name="USER_EMAIL_ADDRESS" />. الرجاء استخدام الحساب نفسه لتسجيل الدخول مرة أخرى.</translation>
 <translation id="7962572577636132072">‏يجري تحديث Chromium تلقائيًا بحيث يكون لديك أحدث إصدار.</translation>
 <translation id="7979877361127045932">‏الإخفاء في قائمة Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb
index 65fe88b7..e214ffd1 100644
--- a/chrome/app/resources/chromium_strings_el.xtb
+++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -32,6 +32,7 @@
 <translation id="1967743265616885482">Έχει διαπιστωθεί ότι μια λειτουργική μονάδα με το ίδιο όνομα βρίσκεται σε διένεξη με το Chromium.</translation>
 <translation id="2077129598763517140">Χρήση της επιτάχυνσης υλικού όταν είναι διαθέσιμη</translation>
 <translation id="2097986737970966220">Άνοιγμα Chromium σε επιτραπέζιο υπολογιστή</translation>
+<translation id="2117181891440368863">Το Chromium επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή αλλά δεν ήταν έγκυρες.</translation>
 <translation id="2119636228670142020">Σχετικά με το &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Άδειες λογισμικού ανοικτού κώδικα του Chromium OS</translation>
 <translation id="2233513990531887259">Επανέναρξη στη λειτουργία εμβυθιστικής προβολής του Chromium</translation>
@@ -180,6 +181,7 @@
 <translation id="6734080038664603509">Ενημέρωση &amp;Chromium</translation>
 <translation id="6757767188268205357">Δεν με ενδιαφέρει</translation>
 <translation id="6810143991807788455">Συμβάλετε στη βελτίωση του Chromium αναφέροντας τις τρέχουσες ρυθμίσεις</translation>
+<translation id="6838494703713445896">Το Chromium επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν έγκυρες πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή.</translation>
 <translation id="6883876366448858277">στέλνει μια λέξη και το συγκείμενό της στην Αναζήτηση Google και φέρνει ως αποτέλεσμα ορισμούς, εικόνες και άλλα αποτελέσματα αναζήτησης.</translation>
 <translation id="6893813176749746474">Το Chromium έχει ενημερωθεί, αλλά δεν το έχετε χρησιμοποιήσει για 30 ημέρες τουλάχιστον.</translation>
 <translation id="6900895776413482243">Η επανεκκίνηση στη λειτουργία εμβυθιστικής προβολής του Chromium θα κλείσει και θα εκκινήσει ξανά τις εφαρμογές σας στο Chromium.</translation>
@@ -192,6 +194,7 @@
 <translation id="7066436765290594559">Το Chromium OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας. Ενημερώστε τη φράση πρόσβασης συγχρονισμού.</translation>
 <translation id="7138853919861947730">Το Chromium μπορεί να χρησιμοποιήσει υπηρεσίες ιστού για να βελτιώσει την εμπειρία περιήγησής σας.</translation>
 <translation id="7162152143154757523">Το Chromium μπορεί να παρέχει πιο έξυπνο ορθογραφικό έλεγχο, αποστέλλοντας ό,τι πληκτρολογείτε στο πρόγραμμα περιήγησης, στους διακομιστές της Google, επιτρέποντάς σας να χρησιμοποιείτε την ίδια τεχνολογία ορθογραφικού ελέγχου που χρησιμοποιείται από την αναζήτηση Google.</translation>
+<translation id="7178626992616222740">Το Chromium επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή, αλλά το Chromium δεν αναγνώρισε κανένα από τα αρχεία καταγραφής της διαφάνειας πιστοποιητικού.</translation>
 <translation id="7196020411877309443">Γιατί το βλέπω αυτό;</translation>
 <translation id="7205698830395646142">Απόκρυψη στο μενού του Chromium</translation>
 <translation id="7211828883345145708">Ενεργοποιεί επιπλέον συντομεύσεις πληκτρολογίου που είναι χρήσιμες για τον εντοπισμό σφαλμάτων στο Chromium.</translation>
@@ -217,6 +220,7 @@
 <translation id="7723128346970903111">Επιτρέπει τις ροές σύνδεσης Chromium που βασίζονται σε iframe. Διαφορετικά, χρησιμοποιείται ροή που βασίζεται σε προβολή ιστού.</translation>
 <translation id="7729447699958282447">Το Chromium δεν κατάφερε να συγχρονίσει τα δεδομένα σας επειδή ο συγχρονισμός δεν είναι διαθέσιμος για τον τομέα σας.</translation>
 <translation id="7747138024166251722">Δεν ήταν δυνατή η δημιουργία ενός προσωρινού καταλόγου από το πρόγραμμα εγκατάστασης. Ελέγξτε τον κενό χώρο του δίσκου και το δικαίωμα εγκατάστασης του λογισμικού.</translation>
+<translation id="7918535023914021398">Το Chromium επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Δεν παρασχέθηκαν πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή.</translation>
 <translation id="7937630085815544518">Συνδεθήκατε στο Chromium ως <ph name="USER_EMAIL_ADDRESS" />. Χρησιμοποιήστε τον ίδιο λογαριασμό για να συνδεθείτε ξανά.</translation>
 <translation id="7962572577636132072">Το Chromium ενημερώνεται αυτόματα, προκειμένου να έχετε πάντα στη διάθεσή σας τη νεότερη έκδοση.</translation>
 <translation id="7979877361127045932">Απόκρυψη από το μενού του Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index 24c3ca5..04590bb 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -34,6 +34,7 @@
 <translation id="1967743265616885482">A module with the same name has been known to conflict with Google Chrome.</translation>
 <translation id="2077129598763517140">Use hardware acceleration when available</translation>
 <translation id="2097986737970966220">Open Chromium on the desktop</translation>
+<translation id="2117181891440368863">Chromium verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied Certificate Transparency information, but it was invalid.</translation>
 <translation id="2119636228670142020">About &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Chromium OS open source licences</translation>
 <translation id="2233513990531887259">Relaunch in Chromium immersive mode</translation>
@@ -179,6 +180,7 @@
 <translation id="6734080038664603509">Update &amp;Chromium</translation>
 <translation id="6757767188268205357">Don't bother me</translation>
 <translation id="6810143991807788455">Help make Chromium better by reporting the current settings</translation>
+<translation id="6838494703713445896">Chromium verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied valid Certificate Transparency information.</translation>
 <translation id="6883876366448858277">sends a word and its surrounding context to Google Search, returning definitions, pictures and other search results.</translation>
 <translation id="6893813176749746474">Chromium has been updated, but you haven't used it for 30 days or more.</translation>
 <translation id="6900895776413482243">Relaunching in Chromium immersive mode will close and relaunch your Chromium apps.</translation>
@@ -191,6 +193,7 @@
 <translation id="7066436765290594559">Chromium OS could not sync your data. Please update your Sync passphrase.</translation>
 <translation id="7138853919861947730">Chromium may use web services to improve your browsing experience.</translation>
 <translation id="7162152143154757523">Chromium can provide smarter spell-checking by sending what you type in the browser to Google servers, allowing you to use the same spell-checking technology used by Google search.</translation>
+<translation id="7178626992616222740">Chromium verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied Certificate Transparency information, but Chromium did not recognise any of the Certificate Transparency logs.</translation>
 <translation id="7196020411877309443">Why am I seeing this?</translation>
 <translation id="7205698830395646142">Hide in Chromium Menu</translation>
 <translation id="7211828883345145708">Enables additional keyboard shortcuts that are useful for debugging Chromium.</translation>
@@ -216,6 +219,7 @@
 <translation id="7723128346970903111">When enabled, will use an iframe-based Chromium sign-in flow; otherwise uses a webview-based flow.</translation>
 <translation id="7729447699958282447">Chromium could not sync your data because Sync is not available for your domain.</translation>
 <translation id="7747138024166251722">The installer couldn't create a temporary directory. Please check for free disk space and permission to install software.</translation>
+<translation id="7918535023914021398">Chromium verified that <ph name="ISSUER" /> issued this website's certificate. The server did not supply any Certificate Transparency information.</translation>
 <translation id="7937630085815544518">You were signed in to Chromium as <ph name="USER_EMAIL_ADDRESS" />. Please use the same account to sign in again.</translation>
 <translation id="7962572577636132072">Chromium updates automatically so you always have the freshest version.</translation>
 <translation id="7979877361127045932">Hide in Chromium menu</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index 564e742..5b49a42 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -34,6 +34,7 @@
 <translation id="1967743265616885482">May module na may kaparehong pangalan ang natuklasang sumasalungat sa Chromium.</translation>
 <translation id="2077129598763517140">Gamitin ang pagpapabilis ng hardware kapag available</translation>
 <translation id="2097986737970966220">Buksan ang Chromium sa desktop</translation>
+<translation id="2117181891440368863">Na-verify ng Chromium na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng impormasyon tungkol sa Certificate Transparency, ngunit hindi iyon wasto.</translation>
 <translation id="2119636228670142020">Tungkol sa &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Mga lisensya ng open source ng Chromium OS</translation>
 <translation id="2233513990531887259">Ilunsad muli sa Chromium immersive mode</translation>
@@ -179,6 +180,7 @@
 <translation id="6734080038664603509">I-update ang &amp;Chromium</translation>
 <translation id="6757767188268205357">Huwag akong istorbohin</translation>
 <translation id="6810143991807788455">Tumulong na pahusayin ang Chromium sa pamamagitan ng pag-uulat sa mga kasalukuyang setting</translation>
+<translation id="6838494703713445896">Na-verify ng Chromium na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng wastong impormasyon tungkol sa Certificate Transparency.</translation>
 <translation id="6883876366448858277">ipapadala ang isang salita at ang konteksto nito sa Google Search, at magbibigay ng mga pagpapakahulugan, larawan at iba pang mga resulta ng paghahanap.</translation>
 <translation id="6893813176749746474">Na-update na ang Chromium, ngunit hindi mo pa ito nagagamit sa loob ng hindi bababa sa 30 araw.</translation>
 <translation id="6900895776413482243">Kapag inilunsad muli sa Chromium immersive mode isasara at ilulunsad muli ang iyong mga app sa Chromium.</translation>
@@ -191,6 +193,7 @@
 <translation id="7066436765290594559">Hindi ma-sync ng Chromium OS ang iyong data. Paki-update ang iyong Passphrase sa pag-sync.</translation>
 <translation id="7138853919861947730">Maaaring gumamit ang Chromium ng mga serbisyo sa web upang mapahusay ang iyong karanasan sa pagba-browse.</translation>
 <translation id="7162152143154757523">Maaaring magbigay ang Chromium ng mas pinahusay na pag-i-spell check sa pamamagitan ng pagpapadala sa mga server ng Google ng tina-type mo sa browser, na nagbibigay-daan sa iyo na gamitin ang parehong teknolohiya ng pag-i-spell check na ginamit ng paghahanap sa Google.</translation>
+<translation id="7178626992616222740">Na-verify ng Chromium na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng impormasyon tungkol sa Certificate Transparency, ngunit hindi natukoy ng Chromium ang alinman sa mga log ng Certificate Transparency.</translation>
 <translation id="7196020411877309443">Bakit ko nakikita ito?</translation>
 <translation id="7205698830395646142">Itago sa Menu ng Chromium</translation>
 <translation id="7211828883345145708">Pinapagana ang karagdagang mga keyboard shortcut na kapaki-pakinabang para sa pag-debug ng Chromium.</translation>
@@ -216,6 +219,7 @@
 <translation id="7723128346970903111">Kapag naka-enable, gagamit ng isang daloy ng pag-sign in ng Chromium na batay sa iframe; kung hindi ay gumagamit ng isang daloy na batay sa webview.</translation>
 <translation id="7729447699958282447">Hindi mai-sync ng Chromium ang iyong data dahil hindi available ang Pag-sync para sa iyong domain.</translation>
 <translation id="7747138024166251722">Hindi makalikha ng pansamantalang direktoryo ang installer. Paki-suri para sa puwang sa disk na walang laman at pahintulot upang i-install ang software.</translation>
+<translation id="7918535023914021398">Na-verify ng Chromium na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Hindi nagbigay ang server ng anumang impormasyon tungkol sa Certificate Transparency.</translation>
 <translation id="7937630085815544518">Naka-sign in ka sa Chromium bilang <ph name="USER_EMAIL_ADDRESS" />. Pakigamit ang parehong account upang mag-sign in muli.</translation>
 <translation id="7962572577636132072">Awtomatikong nag-a-update ang Chromium upang palagi kang may pinakabagong bersyon.</translation>
 <translation id="7979877361127045932">Itago sa menu ng Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index b0b5483..a3363c4 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -32,6 +32,7 @@
 <translation id="1967743265616885482">Modul dengan nama yang sama biasanya konflik dengan Chromium.</translation>
 <translation id="2077129598763517140">Gunakan percepatan perangkat keras saat tersedia</translation>
 <translation id="2097986737970966220">Buka Chromium di desktop</translation>
+<translation id="2117181891440368863">Chromium memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat, namun informasi tersebut tidak valid.</translation>
 <translation id="2119636228670142020">Tentang &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Lisensi sumber terbuka Chromium OS</translation>
 <translation id="2233513990531887259">Luncurkan ulang dalam mode Chromium yang lebih mendalam</translation>
@@ -178,6 +179,7 @@
 <translation id="6734080038664603509">Pembaruan &amp;Chromium</translation>
 <translation id="6757767188268205357">Jangan ganggu saya</translation>
 <translation id="6810143991807788455">Bantu menjadikan Chromium lebih baik dengan melaporkan setelan saat ini</translation>
+<translation id="6838494703713445896">Chromium memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat yang valid.</translation>
 <translation id="6883876366448858277">mengirim kata dan konteks di sekitarnya ke Google Penelusuran, mengembalikan definisi, gambar, hasil penelusuran, dan hasil penelusuran lain.</translation>
 <translation id="6893813176749746474">Chromium telah diperbarui, tetapi Anda belum menggunakannya selama setidaknya 30 hari.</translation>
 <translation id="6900895776413482243">Dengan meluncurkan kembali dalam mode Chromium yang lebih mendalam, Anda akan menutup dan meluncurkan kembali aplikasi Chromium.</translation>
@@ -190,6 +192,7 @@
 <translation id="7066436765290594559">Chromium OS tidak dapat menyinkronkan data Anda. Perbarui frasa sandi Sinkronisasi Anda.</translation>
 <translation id="7138853919861947730">Chromium dapat menggunakan layanan web untuk meningkatkan pengalaman penjelajahan Anda.</translation>
 <translation id="7162152143154757523">Chromium dapat memberikan pemeriksa ejaan yang lebih pintar dengan mengirimkan apa yang Anda ketik di browser ke server Google, sehingga memungkinkan Anda menggunakan teknologi pemeriksa ejaan yang sama seperti yang digunakan oleh penelusuran Google.</translation>
+<translation id="7178626992616222740">Chromium memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat, namun Chromium tidak mengenali log Transparansi Sertifikat apa pun.</translation>
 <translation id="7196020411877309443">Mengapa saya melihat ini?</translation>
 <translation id="7205698830395646142">Sembunyikan di Menu Chromium</translation>
 <translation id="7211828883345145708">Mengaktifkan pintasan keyboard tambahan yang berguna untuk Chromium debugging.</translation>
@@ -215,6 +218,7 @@
 <translation id="7723128346970903111">Jika diaktifkan, alur masuk Chromium berbasis iframe akan digunakan; jika tidak, yang digunakan adalah alur berbasis tampilan web.</translation>
 <translation id="7729447699958282447">Chromium tidak dapat menyinkronkan data Anda karena Sinkronisasi tidak tersedia untuk domain Anda.</translation>
 <translation id="7747138024166251722">Pemasang tidak dapat membuat direktori sementara. Periksa kapasitas kosong pada disk dan izin untuk memasang perangkat lunak.</translation>
+<translation id="7918535023914021398">Chromium memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server tidak memberikan informasi Transparansi Sertifikat apa pun.</translation>
 <translation id="7937630085815544518">Anda telah masuk ke Chromium sebagai <ph name="USER_EMAIL_ADDRESS" />. Gunakan akun yang sama untuk masuk kembali.</translation>
 <translation id="7962572577636132072">Chromium otomatis diperbarui sehingga Anda selalu memiliki versi terbaru.</translation>
 <translation id="7979877361127045932">Sembunyikan di menu Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 2e8aa5b..b633a7d 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -32,6 +32,7 @@
 <translation id="1967743265616885482">‏מודול בעל אותו שם מתנגש עם Chromium.</translation>
 <translation id="2077129598763517140">השתמש בהאצת חומרה כשניתן</translation>
 <translation id="2097986737970966220">‏פתח את Chromium בשולחן העבודה</translation>
+<translation id="2117181891440368863">‏Chromium אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת סיפק פרטים על שקיפות האישור אבל הם לא חוקיים.</translation>
 <translation id="2119636228670142020">‏מידע על &amp;מערכת ההפעלה של Chromium‏</translation>
 <translation id="2158734852934720349">‏רישיונות קוד פתוח של מערכת ההפעלה של Chromium</translation>
 <translation id="2233513990531887259">‏הפעל מחדש במצב עשיר של Chromium</translation>
@@ -176,6 +177,7 @@
 <translation id="6734080038664603509">‏עדכן &amp;את Chromium‏</translation>
 <translation id="6757767188268205357">אל תנדנד לי</translation>
 <translation id="6810143991807788455">‏עזור לשפר את Chromium על ידי דיווח ההגדרות הנוכחיות</translation>
+<translation id="6838494703713445896">‏Chromium אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת סיפק פרטים חוקיים על שקיפות האישור.</translation>
 <translation id="6883876366448858277">‏שולח לחיפוש Google מילה יחד עם ההקשר סביבה. מחזיר הגדרות, תמונות, ותוצאות חיפוש נוספות.</translation>
 <translation id="6893813176749746474">‏Chromium עודכן, אך לא השתמשת בו לפחות 30 ימים.</translation>
 <translation id="6900895776413482243">‏הפעלה מחדש במצב עשיר של Chromium תסגור ותפעיל מחדש את יישומי Chromium.</translation>
@@ -188,6 +190,7 @@
 <translation id="7066436765290594559">‏מערכת ההפעלה של Chromium לא הצליחה לסנכרן את הנתונים שלך. עדכן את משפט הסיסמה לסנכרון.</translation>
 <translation id="7138853919861947730">‏Chromium עשוי להשתמש בשירותי אינטרנט כדי לשפר את חווית הגלישה שלך.</translation>
 <translation id="7162152143154757523">‏Chromium יכול לספק בדיקת איות חכמה יותר על ידי שליחת הטקסט שאתה מקליד בדפדפן אל שרתי Google. כך אתה יכול להשתמש באותה טכנולוגיה של בדיקת איות שבה נעשה שימוש בחיפוש Google.</translation>
+<translation id="7178626992616222740">‏Chromium אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת סיפק פרטים על שקיפות האישור אבל Chromium לא זיהה את היומנים של שקיפות האישור.</translation>
 <translation id="7196020411877309443">למה אני רואה את הדף הזה?</translation>
 <translation id="7205698830395646142">‏הסתרה בתפריט Chromium</translation>
 <translation id="7211828883345145708">‏מפעיל מקשי קיצור נוספים השימושיים לתיקון באגים ב-‏Chromium.</translation>
@@ -213,6 +216,7 @@
 <translation id="7723128346970903111">‏כשמצב זה מופעל, ייעשה שימוש בתהליך כניסה אל Chromium המבוסס על iframe. אם לא יופעל, ייעשה שימוש בתהליך המבוסס על WebView.</translation>
 <translation id="7729447699958282447">‏Chromium לא הצליח לסנכרן את הנתונים שלך מפני שסנכרון אינו זמין עבור הדומיין שלך.</translation>
 <translation id="7747138024166251722">המתקין לא הצליח ליצור ספריה זמנית. בדוק את המקום הפנוי בדיסק ואת האישור להתקנת תוכנה.</translation>
+<translation id="7918535023914021398">‏Chromium אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת לא סיפק פרטים על שקיפות האישור.</translation>
 <translation id="7937630085815544518">‏נכנסת ל-Chromium כ-<ph name="USER_EMAIL_ADDRESS" />. השתמש באותו חשבון כדי להיכנס שוב.</translation>
 <translation id="7962572577636132072">‏Chromium מתעדכן באופן אוטומטי כך שתמיד ברשותך הגרסה העדכנית ביותר.</translation>
 <translation id="7979877361127045932">‏הסתר בתפריט Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index d37fc6e..d26f3af3 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -32,6 +32,7 @@
 <translation id="1967743265616885482">Modul dengan nama yang sama telah diketahui bercanggah dengan Chromium.</translation>
 <translation id="2077129598763517140">Gunakan pecutan perkakasan apabila tersedia</translation>
 <translation id="2097986737970966220">Buka Chromium pada desktop</translation>
+<translation id="2117181891440368863">Chromium mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil, tetapi tidak sah.</translation>
 <translation id="2119636228670142020">Mengenai &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Lesen sumber terbuka Chromium OS</translation>
 <translation id="2233513990531887259">Lancarkan semula dalam mod benaman Chromium</translation>
@@ -178,6 +179,7 @@
 <translation id="6734080038664603509">Kemas kini &amp;Chromium</translation>
 <translation id="6757767188268205357">Jangan ganggu saya</translation>
 <translation id="6810143991807788455">Bantu jadikan Chromium lebih baik dengan melaporkan tetapan semasa</translation>
+<translation id="6838494703713445896">Chromium mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil yang sah.</translation>
 <translation id="6883876366448858277">menghantar perkataan dan konteks sekitarnya kepada Carian Google, mengembalikan takrif, gambar dan hasil carian lain.</translation>
 <translation id="6893813176749746474">Chromium telah dikemas kini, tetapi anda belum menggunakannya untuk sekurang-kurangnya 30 hari.</translation>
 <translation id="6900895776413482243">Melancarkan semula dalam mod benaman Chromium akan menutup dan melancarkan semula apl Chromium anda.</translation>
@@ -190,6 +192,7 @@
 <translation id="7066436765290594559">OS Chromium tidak dapat menyegerakkan data anda. Sila kemas kini frasa laluan Segerak anda.</translation>
 <translation id="7138853919861947730">Chromium boleh menggunakan perkhidmatan web untuk meningkatkan pengalaman penyemakan imbas anda.</translation>
 <translation id="7162152143154757523">Chromium dapat menyediakan semakan ejaan yang lebih pintar dengan menghantar apa yang anda taip dalam penyemak imbas kepada pelayan Google, membolehkan anda menggunakan teknologi semakan ejaan yang sama seperti yang digunakan oleh carian Google.</translation>
+<translation id="7178626992616222740">Chromium mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan siil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil, tetapi Chromium tidak mengenali mana-mana log Ketelusan Sijil.</translation>
 <translation id="7196020411877309443">Mengapakah halaman ini yang saya lihat?</translation>
 <translation id="7205698830395646142">Sembunyikan dalam Menu Chromium</translation>
 <translation id="7211828883345145708">Mendayakan pintasan papan kekunci tambahan yang berguna untuk menyahpepijat Chromium.</translation>
@@ -215,6 +218,7 @@
 <translation id="7723128346970903111">Apabila didayakan, akan menggunakan aliran log masuk Chromium berasaskan iframe; atau pun menggunakan aliran berasaskan paparan web.</translation>
 <translation id="7729447699958282447">Chromium tidak dapat menyegerakkan data anda kerana Segerak tidak tersedia untuk domain anda.</translation>
 <translation id="7747138024166251722">Pemasang tidak dapat mencipta direktori sementara. Sila semak ruang cakera kosong dan kebenaran untuk memasang perisian.</translation>
+<translation id="7918535023914021398">Chromium mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan tidak membekalkan sebarang maklumat Ketelusan Sijil.</translation>
 <translation id="7937630085815544518">Anda telah log masuk ke Chromium sebagai <ph name="USER_EMAIL_ADDRESS" />. Sila gunakan akaun yang sama untuk log masuk lagi.</translation>
 <translation id="7962572577636132072">Chromium dikemas kini secara automatik supaya anda sentiasa mempunyai versi yang terbaharu.</translation>
 <translation id="7979877361127045932">Sembunyikan dalam menu Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb
index b6aee7a..221770e8 100644
--- a/chrome/app/resources/chromium_strings_sk.xtb
+++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -34,6 +34,7 @@
 <translation id="1967743265616885482">Zistilo sa, že modul s rovnakým názvom spôsobuje konflikt s prehliadačom Chromium.</translation>
 <translation id="2077129598763517140">Používať hardvérovú akceleráciu (keď je dostupná)</translation>
 <translation id="2097986737970966220">Otvoriť prehliadač Chromium na pracovnej ploche</translation>
+<translation id="2117181891440368863">Prehliadač Chromium overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol informácie o transparentnosti certifikátu, boli však neplatné.</translation>
 <translation id="2119636228670142020">Informácie o systéme &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Licencie open source systému OS Chromium</translation>
 <translation id="2233513990531887259">Znova spustiť prehliadač Chromium v imerznom režime</translation>
@@ -179,6 +180,7 @@
 <translation id="6734080038664603509">Aktualizovať prehliadač &amp;Chromium</translation>
 <translation id="6757767188268205357">Nezobrazovať výzvu</translation>
 <translation id="6810143991807788455">Nahláste aktuálne nastavenia a pomôžte tak zlepšiť prehliadač Chromium</translation>
+<translation id="6838494703713445896">Prehliadač Chromium overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol platné informácie o transparentnosti certifikátu.</translation>
 <translation id="6883876366448858277">odošle slovo a súvisiaci kontext do Vyhľadávania Google, pričom vráti definície, obrázky, výsledky vyhľadávania a ďalšie podrobnosti.</translation>
 <translation id="6893813176749746474">Prehliadač Chromium bol aktualizovaný, ale najmenej 30 dní ste ho nepoužili.</translation>
 <translation id="6900895776413482243">Opätovné spustenie prehliadača Chromium v imerznom režime spôsobí zavretie a opätovné spustenie aplikácií prehliadača Chromium.</translation>
@@ -191,6 +193,7 @@
 <translation id="7066436765290594559">Systému OS Chromium sa nepodarilo synchronizovať vaše údaje. Aktualizujte prístupovú frázu synchronizácie.</translation>
 <translation id="7138853919861947730">Prehliadač Chromium vám môže spríjemniť prehliadanie pomocou webových služieb.</translation>
 <translation id="7162152143154757523">Prehliadač Chromium vám ponúka inteligentnejšiu kontrolu pravopisu tým, že text zadaný do prehliadača odošle serverom spoločnosti Google. Umožňuje vám tak využiť rovnakú technológiu kontroly pravopisu, aká sa používa vo Vyhľadávaní Google.</translation>
+<translation id="7178626992616222740">Prehliadač Chromium overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol informácie o transparentnosti certifikátu, prehliadač Chromium však nerozpoznal žiadne denníky transparentnosti certifikátu.</translation>
 <translation id="7196020411877309443">Prečo sa zobrazila táto výzva?</translation>
 <translation id="7205698830395646142">Skryť v Ponuke Chromium</translation>
 <translation id="7211828883345145708">Povolí ďalšie klávesové skratky, ktoré sú užitočné na ladenie aplikácie Chromium.</translation>
@@ -216,6 +219,7 @@
 <translation id="7723128346970903111">Keď je táto možnosť povolená, bude sa používať prihlasovací postup prehliadača Chromium založený na prvku iframe; inak sa použije postup založený na webovom zobrazení.</translation>
 <translation id="7729447699958282447">Prehliadaču Chromium sa nepodarilo synchronizovať vaše údaje, pretože možnosť synchronizácie nie je pre vašu doménu k dispozícii.</translation>
 <translation id="7747138024166251722">Inštalátor nemohol vytvoriť dočasný priečinok. Skontrolujte úroveň zaplnenia disku a povolenie na inštaláciu softvéru.</translation>
+<translation id="7918535023914021398">Prehliadač Chromium overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server neposkytol žiadne informácie o transparentnosti certifikátu.</translation>
 <translation id="7937630085815544518">Do prehliadača Chromium ste boli prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS" />. Ak sa chcete prihlásiť znova, použite rovnaký účet.</translation>
 <translation id="7962572577636132072">Chromium sa aktualizuje automaticky, aby ste mali vždy k dispozícii najnovšiu verziu.</translation>
 <translation id="7979877361127045932">Skryť v Ponuke Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index d5ac5691..97e8d73c 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -34,6 +34,7 @@
 <translation id="1967743265616885482">En modul med samma namn har tidigare varit i konflikt med Chromium.</translation>
 <translation id="2077129598763517140">Använd maskinvaruacceleration när det är tillgängligt</translation>
 <translation id="2097986737970966220">Öppna Chromium på skrivbordet</translation>
+<translation id="2117181891440368863">Chromium har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. De certifikattransparensuppgifter som skickades från servern är ogiltiga.</translation>
 <translation id="2119636228670142020">Om &amp;Chromium OS</translation>
 <translation id="2158734852934720349">Licenser för öppen källkod för Chromium OS</translation>
 <translation id="2233513990531887259">Starta om i integrerat läge i Chromium</translation>
@@ -180,6 +181,7 @@
 <translation id="6734080038664603509">Uppdatera &amp;Chromium</translation>
 <translation id="6757767188268205357">Stör mig inte</translation>
 <translation id="6810143991807788455">Hjälp oss att förbättra Chromium genom att rapportera dina aktuella inställningar</translation>
+<translation id="6838494703713445896">Chromium har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Giltiga certifikattransparensuppgifter har skickats från servern.</translation>
 <translation id="6883876366448858277">skickar ett ord med omgivande sammanhang till Google Sök och returnerar definitioner, bilder och andra sökresultat.</translation>
 <translation id="6893813176749746474">Chromium har uppdaterats men du har inte använt det på över 30 dagar.</translation>
 <translation id="6900895776413482243">Om du startar om Chromium i integrerat läge stängs och startas appar i Chromium om.</translation>
@@ -192,6 +194,7 @@
 <translation id="7066436765290594559">Det gick inte att synkronisera data med Chromium. Uppdatera lösenfrasen för synkronisering.</translation>
 <translation id="7138853919861947730">Chromium kan använda webbtjänster för att förbättra din upplevelse när du surfar.</translation>
 <translation id="7162152143154757523">Med Chromiums stavningskontroll skickas det du skriver i webbläsaren till Googles servrar så att du kan använda samma stavningsteknik som används i Googles webbsökning.</translation>
+<translation id="7178626992616222740">Chromium har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Certifikattransparensuppgifter har skickats från servern, men Chromium kunde inte känna igen någon av certifikattransparensloggarna.</translation>
 <translation id="7196020411877309443">Varför visas det här?</translation>
 <translation id="7205698830395646142">Dölj i Chromium-menyn</translation>
 <translation id="7211828883345145708">Aktiverar ytterligare kortkommandon som är användbara vid felsökning av Chromium.</translation>
@@ -217,6 +220,7 @@
 <translation id="7723128346970903111">När det här alternativet är aktiverat används ett iframe-baserat inloggningsflöde i Chromium. Annars används ett flöde baserat på WebView.</translation>
 <translation id="7729447699958282447">Chromium kunde inte synkronisera data eftersom synkronisering inte är tillgängligt för domänen.</translation>
 <translation id="7747138024166251722">Det gick inte att skapa en tillfällig katalog för installationsfilen. Kontrollera diskutrymmet och att du har behörighet att installera program.</translation>
+<translation id="7918535023914021398">Chromium har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Inga certifikattransparensuppgifter skickades från servern.</translation>
 <translation id="7937630085815544518">Du var inloggad i Chromium som <ph name="USER_EMAIL_ADDRESS" />. Använd samma konto när du loggar in igen.</translation>
 <translation id="7962572577636132072">Chromium uppdateras automatiskt så att du alltid har den senaste versionen.</translation>
 <translation id="7979877361127045932">Dölj i Chromium-menyn</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 8c3320c..592d8c4 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">ለሁሉም ተጠቃሚዎች አውቶማቲክ ዝምኖችን አዋቅር</translation>
 <translation id="1079766198702302550">ሁልጊዜ የካሜራ መዳረሻ አግድ</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" />የእርስዎ Chrome ቅንብሮች ወደ የመጀመሪያቸው ነባሪዎች መመለስ ፈልጓል። ይሄ የእርስዎን መነሻ ገጽ፣ አዲስ የትር ገጽ እና የፍለጋ ፕሮግራም ዳግም ያስጀምራቸዋል፣ ቅጥያዎችዎን ያሰናክላቸዋል፣ እና ሁሉንም ትሮች ይነቅላቸዋል። እንዲሁም ሌሎች እንደ ኩኪዎች፣ ይዘት እና የጣቢያ ውሂብ ያለ ጊዜያዊ እና የተሸጎጠ ውሂብንም ያጸዳል።</translation>
 <translation id="108346963417674655">ወደ አገልጋዩ ደህንነት ተጠብቆ ማገናኘት አልተቻለም። ይህ የድርጣቢያ ቀደም ሲል ሰርቶ ሊሆን ይችላል፣ ነገር ግን አገልጋዩ ላይ ችግር አለ። እንደዚህ ወደ መሰሉት ጣቢያዎች ማገናኘቱ ለሁሉም ተጠቃሚዎች ደህንነትን ያዳክማል እናም  እንዲሰናከል ተደርጓል።</translation>
 <translation id="1084538181352409184">ተኪ አገልጋዩ በአግባቡ እየሰራ መሆኑን ለማረጋገጥ ተኪ ቅንብሮችዎን ይፈትሹ ወይም የአውታረ
           መረብዎ አስተዳዳሪን ያግኙ።
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">ካታላን</translation>
 <translation id="1156185823432343624">ድምጽ፦ ጠፍቷል</translation>
 <translation id="1156689104822061371">የቁልፍ ሰሌዳ አቀማመጥ፦</translation>
+<translation id="1158274711289833876">የተጠበቀ TLS ግንኙነት</translation>
 <translation id="1160536908808547677">በሚጎላበት ወቅት ቋሚ ቦታ ያላቸው ክፍሎች እና የተመጠኑ ማሸብለያ አሞሌዎች ከዚህ መመልከቻ ጋር ይያያዛሉ።</translation>
 <translation id="1161575384898972166">የደንበኛ እውቅና ማረጋገጫውን ለመላክ እባክዎ <ph name="TOKEN_NAME" /> ውስጥ ይግቡ።</translation>
 <translation id="1162223735669141505">ይህን ባህሪ ለመጠቀም <ph name="BEGIN_LINK" />ቤተኛ የደንበኛ ተሰኪ<ph name="END_LINK" /> መንቃት አለበት።</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">መሣሪያዎን ለመጠቀም ይበልጥ ቀላል ለማድረግ የተደራሽነት ባህሪያትን ያንቁ።</translation>
 <translation id="1190144681599273207">ይህን ፋይል ማምጣት <ph name="FILE_SIZE" /> አካባቢ የተንቀሳቃሽ ውሂብ ይጠቀማል።</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{ኮምፒውተርዎ ላይ የተከማቸ ፋይልን ይድርሱበት}one{ኮምፒውተርዎ ላይ የተከማቹ  # ፋይሎችን ይድረሱባቸው}other{ኮምፒውተርዎ ላይ የተከማቹ # ፋይሎችን ይድረሱባቸው}}</translation>
+<translation id="1190855992966397019">የAppContainer መቆለፊያን አንቃ።</translation>
 <translation id="1195447618553298278">ያልታወቀ ስህተት።</translation>
 <translation id="1196338895211115272">ግላዊ ቁልፍን መላክ አልተሳካም።</translation>
 <translation id="1196789802623400962">ለምናባዊ የቁልፍ ሰሌዳው በቅንብሮች ገጽ ውስጥ የእጅ እንቅስቃሴ አርትዕ አማራጭን አንቃ/አሰናክል።</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">የአገልግሎት ሰራተኛዎች</translation>
 <translation id="123578888592755962">ዲስክ ሙሉ ነው</translation>
 <translation id="1240892293903523606">የDOM መርማሪ</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ቅንብሮችዎን ዳግም ማስጀመር ይፈልጋሉ።</translation>
 <translation id="1243314992276662751">ስቀል</translation>
 <translation id="1244303850296295656">የቅጥያ ስህተት</translation>
 <translation id="1248269069727746712"><ph name="PRODUCT_NAME" /> ከአውታረ መረቡ ጋር ለመገናኘት የመሣሪያዎ ስርዓት ተኪ ቅንብሮችን እየተጠቀመ ነው።</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">በመሰረዝ ላይ...</translation>
 <translation id="1339266338863469628">ነባሪ (እርስዎን ብቻ ይመርጣል)</translation>
 <translation id="1340527397989195812">የፋይሎች መተግበሪያውን በመጠቀም በመሣሪያው ውስጥ ያለ የማህደረመረጃ ምትኬ ያስቀምጡ።</translation>
+<translation id="1341988552785875222">የአሁኑ የግድግዳ ወረቀት የተዋቀረው በ«<ph name="APP_NAME" />» ነው። የተለየ የግድግዳ ወረቀት ከመምረጥዎ በፊት «<ph name="APP_NAME" />» ማራገፍ ያስፈልግዎት ይሆናል።</translation>
 <translation id="1343517687228689568">ይህን ገጽ  ከመነሻ ገጹ ላይ ይንቀሉት...</translation>
 <translation id="1344519653668879001">የገጽ አገናኝ መቆጣጠርን አሰናክል</translation>
 <translation id="1346104802985271895">የቪዬትናምኛ ግቤት ስልት (TELEX)</translation>
@@ -992,6 +997,7 @@
 <translation id="2421956571193030337">ይህን ባህሪ በሚያምኗቸው መለያዎች ብቻ ይጠቀሙባቸው።</translation>
 <translation id="2422426094670600218">‹ያልተሰየመ›</translation>
 <translation id="2423578206845792524">ምስል አስ&amp;ቀምጥ እንደ…</translation>
+<translation id="2424091190911472304">ሁልጊዜ በ<ph name="ORIGIN" /> ላይ አሂድ</translation>
 <translation id="2433452467737464329">ገጹን በራስ-ሰር ለማደስ በዩ አር ኤል ውስጥ የመጠይቅ ልኬት ያክሉ፦ chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">ገጽታ</translation>
 <translation id="2433728760128592593">በግቤት ስልቶች መካከል ለመቀያየር Alt+Shiftን ይጫኑ።</translation>
@@ -1311,6 +1317,7 @@
 <translation id="2841837950101800123">አቅራቢ</translation>
 <translation id="2843055980807544929">ከተሰናከለ Chrome WM_KEY*ን እና WM_CHARን ለየብቻቸው ያስተናግዳቸዋል።</translation>
 <translation id="2843806747483486897">ነባሪ ቀይር...</translation>
+<translation id="2844111009524261443">አሂድ ላይ ጠቅ አድርግ</translation>
 <translation id="2845382757467349449">ሁልጊዜ የዕልባቶች አሞሌን አሳይ</translation>
 <translation id="2846816712032308263">ፈጣን የትር/መስኮት መዝጋትን አንቃ - የትሩን onunload js መቆጣጠሪያ ከGUI በተናጠል ያስኬዳል።</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1388,6 +1395,7 @@
 <translation id="2937174152333875430">የመተግበሪያ አስጀማሪ ማስመሰያን አንቃ</translation>
 <translation id="2938225289965773019"><ph name="PROTOCOL" /> አገናኞችን ክፈት</translation>
 <translation id="2938685643439809023">ሞንጎልኛ</translation>
+<translation id="2941479658084239256">ከመሥመር ውጭ ለመጠቀም ገጾችን በአካባቢው ላይ ማከማቸትን ያንቁ።</translation>
 <translation id="2942290791863759244">የጀርመንኛ NEO 2 ቁልፍ ሰሌዳ</translation>
 <translation id="2943400156390503548">ስላይድ</translation>
 <translation id="2946119680249604491">ግንኑነት ያክሉ</translation>
@@ -1409,6 +1417,7 @@
 <translation id="2966598748518102999">የ«Ok Google»ን ድምጽ በመላክ እና ትንሽ ቀደም ብሎ ለGoogle በመላክ የድምጽ ፍለጋን ያሻሽሉ።</translation>
 <translation id="2967544384642772068">ግደል</translation>
 <translation id="2968792643335932010">ያነሱ ቅጂዎች</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">ብሩህ ወደ ታች</translation>
 <translation id="2972557485845626008">ጽኑ ትዕዛዝ</translation>
 <translation id="2972581237482394796">&amp;ድገም</translation>
@@ -1471,6 +1480,7 @@
 <translation id="3064388234319122767">በቋንቋ ፊደል መጻፍ (zdravo → здраво)</translation>
 <translation id="3065041951436100775">የትር ተገድሏል ግብረመልስ።</translation>
 <translation id="3065140616557457172">ለመፈለግ ይተይቡ ወይም ለመዳሰስ URL ያስገቡ - ሁሉም ነገር በትክክል ይሰራል።</translation>
+<translation id="3065351588762546748">ከዚህ ጣቢያ ጋር መገናኛው ጠንካራ የፕሮቶኮል ስሪትን እና የስነ መሰውር ጥቅልን በመጠቀም ነው።</translation>
 <translation id="3067198360141518313">ይህን ተሰኪ አሂድ</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> እንደ ክትትል የሚደረግበት ተጠቃሚ ሆኖ ተፈጥሯል!</translation>
 <translation id="3075874217500066906">የPowerwash ሂደቱን ለመጀመር ዳግም ማስጀመር ያስፈልጋል። ዳግም ከተጀመረ በኋላ መቀጠል እንደሚፈልጉ እንዲያረጋግጡ ይጠየቃሉ።</translation>
@@ -1650,6 +1660,7 @@
 <translation id="3308006649705061278">ድርጅታዊ መስፈርት (OU)</translation>
 <translation id="3308116878371095290">ይህ ገጽ ኩኪዎችን ከማቀናጀት ተከልክሏል።</translation>
 <translation id="3308134619352333507">አዘራር ደብቅ</translation>
+<translation id="3309747692199697901">ሁልጊዜ በሁሉም ጣቢያዎች ላይ አሂድ</translation>
 <translation id="3313590242757056087">ክትትል የሚደረግበት ተጠቃሚ የትኛዎቹን ድር ጣቢያዎች መመልከት እንደሚችል ለማዋቀር <ph name="MANAGEMENT_URL" />ን
     በመጎብኘት ገደቦችን እና ቅንብሮችን ማዋቀር ይችላሉ።
     ነባሪ ቅንብሮቹን ካልቀየሩ <ph name="USER_DISPLAY_NAME" /> በድሩ ላይ
@@ -1729,6 +1740,7 @@
 <translation id="3423858849633684918">እባክዎ <ph name="PRODUCT_NAME" />ን ዳግም ያስጀምሩት</translation>
 <translation id="3426704822745136852">የራስተር ተከታታዮቹን ቁጥር ይግለጹ።</translation>
 <translation id="3428010780253032925">በእይዎች ውስጥ በሬክታንግል-የተመሰረተ ኢላማን ያሰናክሉ</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{በተሰባጠሩ መሣሪያዎች ውስጥ ቢያንስ 1 ንጥል}=1{1 ንጥል (እና ተጨማሪ በተሰባጠሩ መሣሪያዎች ላይ)}one{# ንጥሎች (እና ተጨማሪ በተሰባጠሩ መሣሪያዎች ላይ)}other{# ንጥሎች (እና ተጨማሪ በተሰባጠሩ መሣሪያዎች ላይ)}}</translation>
 <translation id="3429599832623003132">$1 ንጥሎች</translation>
 <translation id="3433621910545056227">ውይ!  ስርዓቱ የመሣሪያ ጭነት-ሰዓት አይነታዎች ቁልፉን መመስረት አልተሳካለትም።</translation>
 <translation id="343467364461911375">አንዳንድ የይዘት አገልግሎቶች ጥበቃ ለሚደረግለት ይዘት መዳረሻ ለመፍቀድ እርስዎን ለመለየት የማሽን ለዪዎችን ይጠቀማሉ።</translation>
@@ -2008,6 +2020,7 @@
 <translation id="3759933321830434300">የድረ-ገጾች ክፍሎችን ያግዳል</translation>
 <translation id="3760460896538743390">&amp;የጀርባ ገጽ ይመርምሩ</translation>
 <translation id="37613671848467444">&amp;ማንነትን በማያሳውቅ መስኮት ውስጥ ክፈት</translation>
+<translation id="3763401818161139108">ሁልጊዜ በ <ph name="ORIGIN" /> ላይ አሂድ</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{በዩኤስቢ መሣሪያ መልዕክት ይለዋወጡ}one{በ# ዩኤስቢ መሣሪያዎች መልዕክት ይለዋወጡ}other{በ# ዩኤስቢ መሣሪያዎች መልዕክት ይለዋወጡ}}</translation>
 <translation id="3764800135428056022">የድር ይለፍ ቃላትዎን ለማስቀመጥ ያቅርቡ።</translation>
 <translation id="3764986667044728669">መመዝገብ አልተቻለም</translation>
@@ -2230,6 +2243,7 @@
 <translation id="409579654357498729">ወደ የደመና ህትመት ያክሉ</translation>
 <translation id="4096508467498758490">የገንቢ ሁኔታ ቅጥያዎችን ያሰናክሉ</translation>
 <translation id="4098354747657067197">አሳሳች ጣቢያ ከፊት አለ</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{ምንም}=1{}one{#}other{#}}</translation>
 <translation id="409980434320521454">ማመሳሰል አልተሳካም</translation>
 <translation id="4103763322291513355">የተከለከሉ የዩ አር ኤሎች ዝርዝር እና ሌሎች በስርዓት አስተዳዳሪዎ አስገዳጅነት የተሰጣቸው መመሪያዎችን ለማየት &lt;strong&gt;chrome://policy&lt;/strong&gt;ን ይጎብኙ።</translation>
 <translation id="4104163789986725820">ወደ &amp;ውጪ ላክ...</translation>
@@ -2443,6 +2457,7 @@
 <translation id="4439318412377770121"><ph name="DEVICE_NAME" />ን በGoogle ደመና መሣሪያዎች ላይ ማስመዝገብ ይፈልጋሉ?</translation>
 <translation id="4441124369922430666">ማሽኑ ሲበራ ይህን መተግበሪያ በራስ-ሰር እንዲጀመር ይፈልጋሉ?</translation>
 <translation id="444134486829715816">ዘርጋ...</translation>
+<translation id="4442309605992420742">የWeave ጥምረት ያንቁ</translation>
 <translation id="444267095790823769">የተጠበቁ የይዘት ልዩ ሁኔታዎች</translation>
 <translation id="4443536555189480885">&amp;እገዛ</translation>
 <translation id="4444304522807523469">በዩ.ኤስ.ቢ ወይም በአካባቢ አውታረ መረብ በኩል የተያያዙ የሰነድ ቃኚዎችን ይድረስባቸው</translation>
@@ -2504,6 +2519,7 @@
 <translation id="4545759655004063573">በቂ ባልሆኑ ፍቃዶች ምክንያት ማስቀመጥ አልተቻለም። እባክዎ ሌላ ቦታ ላይ ያስቀምጡ።</translation>
 <translation id="4547659257713117923">ከሌሎች መሣሪያዎች ምንም ትሮች የሉም</translation>
 <translation id="4547992677060857254">የመረጡት አቃፊ ሊጎዱ የሚችሉ ፋይሎች አሉት። እርግጠኛ ነዎት ዘላቂ የዚህ አቃፊ የመጻፍ መዳረሻ ለ«$1» መስጠት ይፈልጋሉ?</translation>
+<translation id="4552495056028768700">የገፅ መዳረሻ</translation>
 <translation id="4552678318981539154">ተጨማሪ ማከማቻ ይግዙ</translation>
 <translation id="4554591392113183336">ውጫዊ ቅጥያው ከነባሩ ጋር ተመሳሳይ ወይም ያነሰ ስሪት ነው።</translation>
 <translation id="4554796861933393312">የቁስ ንድፍ Ink Drop እነማ ፍጥነት</translation>
@@ -2770,6 +2786,7 @@
 <translation id="4920887663447894854">የሚከተለሉት ጣቢያዎች በዚህ ገጽ ላይ አካባቢዎን ከመከታተል ታግደዋል፦</translation>
 <translation id="492322146001920322">ቁጥብ የማህደረ ትውስታ ግፊት ማስለቀቂያ ስትራቲጂ</translation>
 <translation id="4923279099980110923">አዎ፣ ማገዝ እፈልጋለሁ</translation>
+<translation id="4924202073934898868">ደህንትን ለማሻሻል የAppContainer አጠቃቀም በsandboxed ሂደቶች ላይ ያነቃል።</translation>
 <translation id="4924638091161556692">ተጠግኗል</translation>
 <translation id="4925542575807923399">የዚህ መለያ አስተዳዳሪ በአንድ ባለብዙ መለያ መግቢያ ክፍለ-ጊዜ ላይ ይህ መለያ መጀምሪያ እንዲገባ ይፈልጋል።</translation>
 <translation id="4927301649992043040">ቅጥያ ጠቅልል</translation>
@@ -3287,6 +3304,7 @@
 <translation id="5662457369790254286">የAndroid ስልክ ገጽ የመጫን ሂደት አሞሌ እነማን ያዋቅራል።</translation>
 <translation id="5663459693447872156">በራስ-ሰር ወደ ግማሽ-ስፋት ቀይር</translation>
 <translation id="5669267381087807207">በማግበር ላይ</translation>
+<translation id="5669462439438204699">ክሬዲት ካርድ አስቀምጥ</translation>
 <translation id="5671961047338275645">ጣቢያዎችን ያቀናብሩ</translation>
 <translation id="5673305876422468017">Link Disambiguation Popupን አንቃ።</translation>
 <translation id="5676267133227121599">ከማናቸውም መሣሪያ ላይ በ<ph name="MANAGEMENT_LINK" /> ላይ የእርስዎን የይለፍ ቃሎች ይድረሱባቸው።</translation>
@@ -3479,6 +3497,7 @@
 <translation id="5941343993301164315">እባክዎ ወደ <ph name="TOKEN_NAME" /> ይግቡ።</translation>
 <translation id="5941711191222866238">አሳንስ</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">በቅድመ እይታ የንግግር ሳጥን ላይ የአቅልል ገፅ የምልክት ሳጥንን አስወግድ</translation>
 <translation id="5945992478690277605">የፒንች ምናባዊ መመልከቻ አንቃ።</translation>
 <translation id="5946591249682680882">የሪፖርት መታወቂያ <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">የግል አውታረ መረብ ያክሉ</translation>
@@ -3580,11 +3599,14 @@
         ችግሩ ከቀጠለ መሸጎጫውን ጠርገው ይሞክሩት።  በአንዳንድ አጋጣሚዎች ይሄ የሃርድዌር
         መድከም መጀመር ምልክት ሊሆን ይችላል።</translation>
 <translation id="6084983096586510630">የመጀመሪይ ወገን ግንኙነቶች ብቻ</translation>
+<translation id="6086814797483779854">አሂድ ላይ ጠቅ ያድርጉ</translation>
 <translation id="6086846494333236931">በእርስዎ አስተዳዳሪ የተጫነ</translation>
+<translation id="6088898411501370207">ደንበኛው እና አገልጋዩ የተለመደ SSL ፕሮቶኮል ስሪትን ወይም የስነ መሰውር ጥቅልን አይደግፉም። ይህ ብዙውን ጊዜ የሚፈጠረው አገልጋዩ የተወገደው የ RC4 ድጋፍ ሲያስፈልገው ነው።</translation>
 <translation id="6089481419520884864">ገጹን አጣራ</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">የእርስዎ ካርድ ተረጋግጧል</translation>
 <translation id="6093888419484831006">ዝማኔን በመሰረዝ ላይ...</translation>
+<translation id="6094826672794738469">ተለዋጭ አገልግሎቶች።</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">ሰፍቶ ክፈት</translation>
 <translation id="6096326118418049043">X.500 ስም</translation>
@@ -3731,7 +3753,6 @@
 <translation id="6333834492048057036">ለመፈለግ የአድራሻ አሞሌ ላይ ያተኩሩ</translation>
 <translation id="6339034549827494595">የሩስያኛ ድምፅ አነባበብ (AATSEEL) ቁልፍ ሰሌዳ</translation>
 <translation id="6341850831632289108">አካላዊ አካባቢዎን ያገኛል</translation>
-<translation id="6342069812937806050">ልክ አሁን</translation>
 <translation id="634208815998129842">ተግባር አስተዳዳሪ</translation>
 <translation id="6344170822609224263">የአውታረ መረብ ግንኙነቶች ዝርዝር ይደርሳል</translation>
 <translation id="6344783595350022745">ጽሑፍ አጽዳ</translation>
@@ -3781,6 +3802,7 @@
 <translation id="6417515091412812850">የእውቅና ማረጋገጫው ተሽሮ እንደሆነ ማረጋገጥ አልተቻለም።</translation>
 <translation id="6418160186546245112">ወደ ቀዳሚው የተጫነው የ<ph name="IDS_SHORT_PRODUCT_NAME" /> ስሪት በማድኸር ላይ</translation>
 <translation id="6418481728190846787">የሁሉንም መተግበሪያዎች መዳረሻ እስከመጨረሻው አስወግድ</translation>
+<translation id="6419708387665252597">በቅድመ እይታ ላይ ገፅ አቅልልን አስወግድ</translation>
 <translation id="6419902127459849040">መካከለኛው አውሮፓውያን</translation>
 <translation id="6420676428473580225">ወደ ዴስክቶፕ አክል</translation>
 <translation id="6422329785618833949">ፎቶ ተገልጧል</translation>
@@ -3912,6 +3934,7 @@
 <translation id="6588399906604251380">ፊደል ማረምን ያንቁ</translation>
 <translation id="6589706261477377614">የቁልፍ ብሩህነት ጨምር</translation>
 <translation id="6592267180249644460">የWebRTC ምዝግብ ማስታወሻ <ph name="WEBRTC_LOG_CAPTURE_TIME" /> ላይ ተቀርጸዋል</translation>
+<translation id="6593753688552673085">ከ<ph name="UPPER_ESTIMATE" /> በታች</translation>
 <translation id="6593868448848741421">ምርጥ</translation>
 <translation id="6596092346130528198">የአዲ ትር ገጹ እንደጠበቁት ነው?</translation>
 <translation id="6596325263575161958">የምስጠራ አማራጮች</translation>
@@ -4131,6 +4154,7 @@
 <translation id="6948736568813450284">ለገንቢዎች፦ የማጠሪያ አገልግሎቱን ለGoogle Payments ኤፒአይ ጥሪዎች ይጠቀሙ።</translation>
 <translation id="6949306908218145636">ክፍት ገጾችን በዕልባት ያስቀምጡ...</translation>
 <translation id="695164542422037736">ይህ አማራጭ ነቅቶ ከሆነ፣ እንዲሁም body የተዘጋጀው background-attachment:fixed በሚል ከሆነ፣ ጀርባው የራሱ የሆነ የውህድ ሽፋን ይኖረዋል።</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> በዚህ መሣሪያ ላይ የእርስዎን የይለፍ ቃል ያስተውሳል እና በራስ ሰር መዝግቦ ያስገባዎታል።</translation>
 <translation id="6954850746343724854">ቤተኛ ደንበኛ ለሁሉም የድር መተግበሪያዎች ያነቃል፣ ከChrome ድር  መደብር  ያልተጫኑትም ጭምር።</translation>
 <translation id="6955446738988643816">ብቅ-ባይ ይመርምሩ</translation>
 <translation id="695755122858488207">ያልተመረጠ የሬዲዮ አዝራር</translation>
@@ -4192,6 +4216,7 @@
 <translation id="7015226785571892184">ይህን ጥያቄ ከተቀበሉ የሚከተለው መተግበሪያ ይጀምራል፦
 
  <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">በአካቢያዊ አውታረ መረብ ላይ ባሉ መሣሪያዎች ለተጠበቀ ግንኙነት የWeave ማጣመር በWeave App በሥራ ላይ ይውላል።</translation>
 <translation id="7017004637493394352">እንደገና «Ok Google» ይበሉ</translation>
 <translation id="7017219178341817193">አዲስ ገጽ ያክሉ</translation>
 <translation id="7017354871202642555">መስኮት ከተዋቀረ በኋላ ሁነታውን ማስቀመጥ አልተቻለም።</translation>
@@ -4528,6 +4553,7 @@
 <translation id="7503191893372251637">የNetscape ሰርቲፊኬት አይነት</translation>
 <translation id="7503821294401948377">አዶ «<ph name="ICON" />»ን ለአሳሽ እርምጃ መጫን አልተቻለም።</translation>
 <translation id="750413812607578381"><ph name="PRODUCT_NAME" />ን አሁን ዳግም ማስጀመር አለብዎት።</translation>
+<translation id="7504483980780085481">ይህ ጣቢያ ልክ ያልሆነ የግልፅነት ምስክር ወረቀት መረጃን አቅርቧል።</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> የሚከተለውን ይፈልጋል፦</translation>
 <translation id="750509436279396091">የውርዶች አቃፊን ከፍት</translation>
 <translation id="7505167922889582512">የተደበቁ ፋይሎችን አሳይ</translation>
@@ -4683,6 +4709,7 @@
 <translation id="7717536746040464035">የseccomp-bpf ምስል መስሪያ ማጠሪያን አንቃ</translation>
 <translation id="7719421816612904796">ማሰልጠን ጊዜ አልፎበታል</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7721392263035281016">ይህ ጣቢያ የማይደገፍ ፕሮቶኮል ወይም የስነ መሰውር ጥቅል ስለሚጠቀም ደህንነቱ አስተማማኝ የሆነ ግንኙነት ሊመሰረት አይችልም። ብዙ ጊዜ ይህ የሚከሰተው አገልጋዩ የተወገደውን የRC4 ድጋፍ ሲፈልግ ነው።</translation>
 <translation id="7724603315864178912">ቁረጥ</translation>
 <translation id="7730449930968088409">የእርስዎ ማያ ገጽ ይዘት ይቀርጻል</translation>
 <translation id="7730494089396812859">የክላውድ ምትኬ ዝርዝሮችን አሳይ</translation>
@@ -4783,6 +4810,7 @@
 <translation id="7864539943188674973">ብሉቱዝን ያሰናክሉ</translation>
 <translation id="7870790288828963061">ምንም አዲስ ስሪት ያላቸው የKiosk መተግበሪያዎች አልተገኙም። ምንም የሚዘምን ነገር የለም። እባክዎ የዩ.ኤስ.ቢ. ስቲኩን ያስወግዱ።</translation>
 <translation id="787150342916295244">ክሬዲት ካርድን መቃኘት</translation>
+<translation id="7874357055309047713">ሁልጊዜ በሁሉም ጣቢያዎች ላይ አሂድ</translation>
 <translation id="7876243839304621966">ሁሉንም አስወግድ</translation>
 <translation id="7877451762676714207">ያልታወቀ የአገልጋይ ስህተት። እባክዎ እንደገና ይሞክሩ ወይም የአገልጋይ አስተዳዳሪውን ያግኙ።</translation>
 <translation id="7878999881405658917">Google ወደዚህ ስልክ ማሳወቂያ ልኳል። በብሉቱዝ አማካኝነት ስልክዎ የእርስዎን <ph name="DEVICE_TYPE" /> ከ100 ጫማ ርቀት በላይ እንደተከፈተ ሊያቆየው እንደሚችል ልብ ይበሉ። ይህ ችግር ሊሆንባቸው በሚችሉ አጋጣሚዎች ላይ &lt;a&gt;ይህን ባህሪ ለጊዜው ማሰናከል&lt;/a&gt; ይችላሉ።</translation>
@@ -4822,6 +4850,7 @@
 <translation id="7918257978052780342">ተመዝገብ</translation>
 <translation id="7920092496846849526">ይህን ገጽ መጎብኘት ችግር ካለው ወላጅዎን ጠይቀዋል።</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> በመጠበቅ ላይ…</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> በእነኝህ መሣሪያዎች ላይ ሁሉ የእርስዎን የይለፍ ቃል ያስተውሳል እና በራስ ሰር መዝግቦ ያስገባዎታል።</translation>
 <translation id="7925686952655276919">ለማመሳሰል የተንቀሳቃሽ ስልክ ውሂብን አትጠቀም</translation>
 <translation id="7926906273904422255">ደህንነታቸው ያልተረጋገጡ ምንጮችን ደህንነታቸው ያልተረጋገጡ ወይም «አጠራጣሪ» የሚል ምልክት አድርግበት።</translation>
 <translation id="7928710562641958568">መሣሪያን አውጣ</translation>
@@ -5015,6 +5044,7 @@
 <translation id="8179976553408161302">አስገባ</translation>
 <translation id="8180239481735238521">ገፅ</translation>
 <translation id="8180786512391440389">«<ph name="EXTENSION" />» ምልክት በተደረገባቸው አካባቢዎች ላይ ያሉ ምስሎችን፣ ቪዲዮ እና የድምጽ ፋይሎችን ማንበብ እና መሰረዝ ይችላል።</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{ምንም}=1{1 ንጥል}one{# ንጥሎች}other{# ንጥሎች}}</translation>
 <translation id="8184538546369750125">ሁለንተናዊ ነባሪውን ተጠቀም (ፍቀድ)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - ባለቤት</translation>
 <translation id="8185331656081929126">አዲስ አታሚዎች በአውታረ መረቡ ላይ ሲገኙ ማሳወቂያዎችን አሳይ።</translation>
@@ -5080,6 +5110,7 @@
 <translation id="8263231521757761563">ገባሪ የፕሮቶኮል ተቆጣጣሪዎች</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> የመዳፊት ጠቋሚዎን አሰናክሏል።</translation>
 <translation id="8264718194193514834">«<ph name="EXTENSION_NAME" />» ሙሉ ማያ ገጽን አስነስቷል።</translation>
+<translation id="8267698848189296333">እንደ <ph name="USERNAME" /> በመግባት ላይ</translation>
 <translation id="8272443605911821513">በ«ተጨማሪ መሣሪያዎች» ምናሌው ውስጥ ቅጥያዎች የሚለውን ጠቅ በማድረግ ቅጥያዎችዎን ያቀናብሩ።</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> አሁን ሙሉ ማያ ገጽ ነው፣ እና የመዳፊትዎ ጠቋሚውን ሊያሰናክል ይፈልጋል።</translation>
 <translation id="8275038454117074363">ከውጭ አስመጣ</translation>
@@ -5194,6 +5225,8 @@
 <translation id="8435334418765210033">የታወሱ አውታረ መረቦች</translation>
 <translation id="8437209419043462667">አሜሪካ</translation>
 <translation id="843730695811085446">የዕልባት መተግበሪያዎችንም ጨምሮ የሚስተናገዱ መተግበሪያዎች የድር መተግበሪያ ቅጥ ክፈፍን ያነቃል። ይሄ በአሁኑ ጊዜ ለAsh ብቻ ነው የሚሰራው።</translation>
+<translation id="8437331208797669910">የገፅ መድረሻ</translation>
+<translation id="843760761634048214">ክሬዲት ካርድ አስቀምጥ</translation>
 <translation id="8438601631816548197">ስለድምጽ ፍለጋ</translation>
 <translation id="8439506636278576865">በዚህ ቋንቋ ውስጥ ያሉ ገጾችን ለመተርጎም ያቅርቡ</translation>
 <translation id="8442065444327205563">ሰነድዎ ለመታየት ዝግጁ ነው።</translation>
@@ -5620,6 +5653,7 @@
 <translation id="9039890312082871605">ትሮች ላይ ድምጸ-ከል ያድርጉ</translation>
 <translation id="9040185888511745258"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች የአሰሳ ተሞክሮዎን የሚጎዱ ፕሮግራሞችዎን እንዲጭኑ እርስዎን ለማታለል ሊሞክሩ ይችላሉ (ለምሳሌ፦ የመነሻ ገጽዎን በመቀየር ወይም በጎበኟቸው ጣቢያዎች ላይ ተጨማሪ ማስታወቂያዎችን በማሳየት)።</translation>
 <translation id="9040421302519041149">የዚህ አውታረ መረብ መዳረሻ የተጠበቀ ነው።</translation>
+<translation id="9040967476106479091">ለመግባት ከ<ph name="PASSWORD_MANAGER_BRAND" /> ላይ መለያዎን ይምረጡ</translation>
 <translation id="9041603713188951722">ቅንብሮችን በአንድ መስኮት ውስጥ አሳይ</translation>
 <translation id="904451693890288097">እባክዎ የ«<ph name="DEVICE_NAME" />» ይለፍ ቁልፍ ያስገቡ፦</translation>
 <translation id="904949795138183864"><ph name="URL" /> ላይ ያለው ድረ-ገጽ ከእንግዲህ የለም።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 887cf1b..58100ba 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">إعداد التحديثات التلقائية لجميع المستخدمين</translation>
 <translation id="1079766198702302550">حظر الدخول إلى الكاميرا دومًا</translation>
+<translation id="1082398631555931481">‏يريد <ph name="THIRD_PARTY_TOOL_NAME" /> إعادة إعدادات Chrome إلى الحالة الافتراضية الأصلية. وسيعمل هذا على إعادة تعيين صفحتك الرئيسية وصفحة علامة التبويب الجديدة ومحرك البحث وسيعطّل إضافاتك ويلغي تثبيت كل علامات التبويب. كما سيزيل البيانات الأخرى المؤقتة والمخبأة، مثل ملفات تعريف الارتباط وبيانات الموقع والمحتوى.</translation>
 <translation id="108346963417674655">تعذر الاتصال بالخادم بأمان. ربما عمل هذا الموقع الإلكتروني في السابق، ولكن هناك مشكلة في الخادم. فالاتصال بمثل هذه المواقع يضعف الأمان لجميع المستخدمين وبالتالي تم تعطيله.</translation>
 <translation id="1084538181352409184">تحقق من إعدادات الخادم الوكيل أو اتصل بمشرف الشبكة
           للتأكد من عمل الخادم الوكيل.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">الكتالانية</translation>
 <translation id="1156185823432343624">مستوى الصوت: تم كتم الصوت</translation>
 <translation id="1156689104822061371">تخطيط لوحة المفاتيح:</translation>
+<translation id="1158274711289833876">اتصال آمن لطبقة النقل الآمنة</translation>
 <translation id="1160536908808547677">في حالة التكبير، يتم تضمين العناصر ثابتة الموضع، وأشرطة التمرير محددة الحجم في إطار العرض هذا.</translation>
 <translation id="1161575384898972166">الرجاء تسجيل الدخول إلى <ph name="TOKEN_NAME" /> لتصدير شهادة العميل.</translation>
 <translation id="1162223735669141505">‏يجب تمكين <ph name="BEGIN_LINK" />مكوّن Native Client الإضافي<ph name="END_LINK" /> لاستخدام هذه الميزة.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">تمكين ميزات إمكانية الدخول لتسهيل استخدام الجهاز.</translation>
 <translation id="1190144681599273207">سيؤدي جلب هذا الملف إلى استخدام حوالي <ph name="FILE_SIZE" /> من بيانات الجوال.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{الوصول إلى ملف مخزّن على جهاز الكمبيوتر}zero{ الوصول إلى # من الملفات المخزّنة على جهاز الكمبيوتر}two{الوصول إلى ملفين (#) مخزّنين على جهاز الكمبيوتر}few{ الوصول إلى # ملفات مخزّنة على جهاز الكمبيوتر}many{الوصول إلى # ملفًا مخزنًا على جهاز الكمبيوتر}other{الوصول إلى # من الملفات المخزّنة على جهاز الكمبيوتر}}</translation>
+<translation id="1190855992966397019">‏تمكين إغلاق AppContainer.</translation>
 <translation id="1195447618553298278">خطأ  غير محدّد.</translation>
 <translation id="1196338895211115272">أخفق تصدير المفتاح الخاص.</translation>
 <translation id="1196789802623400962">تمكين/تعطيل خيار تعديل الإيماءة في صفحة إعدادات لوحة المفاتيح الظاهرية.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">عمال الخدمة</translation>
 <translation id="123578888592755962">القرص ممتلئ</translation>
 <translation id="1240892293903523606">‏مراقب DOM</translation>
+<translation id="1242633766021457174">يريد <ph name="THIRD_PARTY_TOOL_NAME" /> إعادة تعيين إعداداتك.</translation>
 <translation id="1243314992276662751">تحميل</translation>
 <translation id="1244303850296295656">خطأ في الإضافة</translation>
 <translation id="1248269069727746712">يستخدم <ph name="PRODUCT_NAME" /> إعدادات وكيل النظام في جهازك للاتصال بالشبكة.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">جارٍ الحذف...</translation>
 <translation id="1339266338863469628">الافتراضي (اختيارك فقط)</translation>
 <translation id="1340527397989195812">‏احتفظ بنسخة احتياطية للوسائط من الجهاز باستخدام تطبيق Files.</translation>
+<translation id="1341988552785875222">يتم تعيين الخلفية الحالية من قبل '<ph name="APP_NAME" />'. قد يلزمك إلغاء تثبيت '<ph name="APP_NAME" />' قبل تحديد خلفية مختلفة.</translation>
 <translation id="1343517687228689568">جارٍ إزالة هذه الصفحة من شاشة البدء...</translation>
 <translation id="1344519653668879001">تعطيل تدقيق الروابط التشعبية</translation>
 <translation id="1346104802985271895">‏أسلوب الإدخال الفيتنامي (TELEX)</translation>
@@ -983,6 +988,7 @@
 <translation id="2421956571193030337">لا تستخدم هذه الميزة إلا مع الحسابات التي تثق بها.</translation>
 <translation id="2422426094670600218">&lt;unnamed&gt;</translation>
 <translation id="2423578206845792524">حف&amp;ظ الصورة باسم...</translation>
+<translation id="2424091190911472304">تشغيل على <ph name="ORIGIN" /> دائمًا</translation>
 <translation id="2433452467737464329">‏إضافة معلمة لطلب البحث في عنوان URL لتحديث الصفحة تلقائيًا: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">المظهر</translation>
 <translation id="2433728760128592593">‏اضغط على مفتاح alt + مفتاح shift للتبديل بين طرق الإدخال.</translation>
@@ -1301,6 +1307,7 @@
 <translation id="2841837950101800123">المزود</translation>
 <translation id="2843055980807544929">‏في حالة التعطيل، سيعمل Chrome على معالجة WM_KEY* وWM_CHAR بشكل منفصل.</translation>
 <translation id="2843806747483486897">تغيير الإجراء الافتراضي...</translation>
+<translation id="2844111009524261443">تشغيل عند النقر</translation>
 <translation id="2845382757467349449">عرض شريط الإشارات المرجعية دائمًا</translation>
 <translation id="2846816712032308263">‏لتمكين الغلق السريع لعلامة التبويب/النافذة - لتشغيل معالج onunload js في علامة التبويب بشكل مستقل عن واجهة المستخدم الرسومية.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1375,6 +1382,7 @@
 <translation id="2937174152333875430">‏مكِّن مزامنة Launcher تطبيقات</translation>
 <translation id="2938225289965773019">فتح روابط <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">المنغولية</translation>
+<translation id="2941479658084239256">تمكين تخزين الصفحات محليًا للاستخدام في وضع عدم الاتصال.</translation>
 <translation id="2942290791863759244">‏لوحة المفاتيح الألمانية Neo 2</translation>
 <translation id="2943400156390503548">الشرائح</translation>
 <translation id="2946119680249604491">إضافة اتصال</translation>
@@ -1396,6 +1404,7 @@
 <translation id="2966598748518102999">‏تحسين البحث الصوتي عبر إرسال صوت "Ok Google"، وما قبل نطق ذلك ببضع ثوانِ إلى Google.</translation>
 <translation id="2967544384642772068">إنهاء</translation>
 <translation id="2968792643335932010">نُسخ أقل</translation>
+<translation id="2971033837577180453">‏&lt;span&gt;رقم التعريف:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">خفوت</translation>
 <translation id="2972557485845626008">البرامج الثابتة</translation>
 <translation id="2972581237482394796">إعا&amp;دة</translation>
@@ -1458,6 +1467,7 @@
 <translation id="3064388234319122767">‏التحويل الصوتي (ذدرافو ← здраво)</translation>
 <translation id="3065041951436100775">التعليقات المرتبطة بعلامة التبويب المعطلة.</translation>
 <translation id="3065140616557457172">‏يمكنك طباعة كلمة أو عبارة للبحث  في الويب أو إدخال عنوان URL للتجوال بين صفحات الويب. الخيار لك.</translation>
+<translation id="3065351588762546748">يستخدم الاتصال بهذا الموقع إصدارًا فعالاً من البروتوكول ومجموعة التشفير.</translation>
 <translation id="3067198360141518313">تشغيل هذا المكون الإضافي</translation>
 <translation id="3075239840551149663">تمّ إنشاء <ph name="NEW_PROFILE_NAME" /> باعتباره مستخدمًا يخضع للإشراف!</translation>
 <translation id="3075874217500066906">يجب إعادة التشغيل لبدء عملية المحو الكامل. بعد إعادة التشغيل سيُطلب منك تأكيد أنك تريد المتابعة.</translation>
@@ -1637,6 +1647,7 @@
 <translation id="3308006649705061278">‏الوحدة التنظيمية (OU)</translation>
 <translation id="3308116878371095290">تم منع هذه الصفحة من تخزين ملفات تعريف الارتباط.</translation>
 <translation id="3308134619352333507">الزر "إخفاء"</translation>
+<translation id="3309747692199697901">تشغيل على جميع المواقع دائمًا</translation>
 <translation id="3313590242757056087">لتعيين مواقع الويب التي يُمكن للمستخدم الذي يخضع للإشراف عرضها، يُمكنك تهيئة القيود والإعدادات عن طريق الانتقال إلى<ph name="MANAGEMENT_URL" />.
     وفي حالة عدم تغيير الإعدادات الافتراضية، <ph name="USER_DISPLAY_NAME" />
     يُمكنك تصفح جميع المواقع على الويب.</translation>
@@ -1713,6 +1724,7 @@
 <translation id="3423858849633684918">الرجاء إعادة تشغيل <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">حدد عدد السلاسل النقطية.</translation>
 <translation id="3428010780253032925">تعطيل الاستهداف المستند إلى شكل المستطيل في طرق العرض</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{عنصر واحد على الأقل على الأجهزة المتزامنة}=1{عنصر واحد (1) (وأكثر على الأجهزة المتزامنة)}two{عنصران (#) (وأكثر على الأجهزة المتزامنة)}few{# عناصر (وأكثر على الأجهزة المتزامنة)}many{# عنصرًا (وأكثر على الأجهزة المتزامنة)}other{# عنصر (وأكثر على الأجهزة المتزامنة)}}</translation>
 <translation id="3429599832623003132">$1 من العناصر</translation>
 <translation id="3433621910545056227">عفوًا!  أخفق النظام في إنشاء قفل سمات وقت التثبيت بالجهاز.</translation>
 <translation id="343467364461911375">تستخدم بعض خدمات المحتوى معرّفات الأجهزة لتحديد هويتك بشكل فريد وذلك لأغراض تتعلق بالسماح بالدخول إلى المحتوى المحمي.</translation>
@@ -1990,6 +2002,7 @@
 <translation id="3759933321830434300">الأجزاء المقيدة من صفحات الويب</translation>
 <translation id="3760460896538743390">فحص &amp;صفحة الخلفية</translation>
 <translation id="37613671848467444">فتح في &amp;نافذة التصفح المتخفي</translation>
+<translation id="3763401818161139108">تشغيل على <ph name="ORIGIN" /> دائمًا</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{‏الاتصال بجهاز USB}zero{‏الاتصال بـ # من أجهزة USB}two{‏الاتصال بجهازي USB (#)}few{‏الاتصال بـ # أجهزة USB}many{‏ الاتصال بـ # جهاز USB}other{‏ الاتصال بـ # من أجهزة USB}}</translation>
 <translation id="3764800135428056022">عرض حفظ كلمات مرور الويب.</translation>
 <translation id="3764986667044728669">تعذّر التسجيل</translation>
@@ -2211,6 +2224,7 @@
 <translation id="409579654357498729">إضافة إلى الطباعة في السحاب</translation>
 <translation id="4096508467498758490">تعطيل إضافات وضع مطور البرامج</translation>
 <translation id="4098354747657067197">موقع مخادع في انتظارك</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{لا شيء}=1{1}two{#}few{#}many{#}other{#}}</translation>
 <translation id="409980434320521454">أخفقت المزامنة</translation>
 <translation id="4103763322291513355">‏انتقل إلى &lt;strong&gt;chrome://policy&lt;/strong&gt; لمشاهدة قائمة بعناوين URL المضافة إلى القائمة السوداء والسياسات الأخرى التي فرضها مشرف النظام.</translation>
 <translation id="4104163789986725820">ت&amp;صدير...</translation>
@@ -2424,6 +2438,7 @@
 <translation id="4439318412377770121">‏هل ترغب في تسجيل <ph name="DEVICE_NAME" /> بأجهزة السحاب في Google؟</translation>
 <translation id="4441124369922430666">هل ترغب في تشغيل هذا التطبيق تلقائيًا عند تشغيل الجهاز؟</translation>
 <translation id="444134486829715816">توسيع...</translation>
+<translation id="4442309605992420742">‏تمكين إقران Weave</translation>
 <translation id="444267095790823769">استثناءات المحتوى المحمي</translation>
 <translation id="4443536555189480885">&amp;تعليمات</translation>
 <translation id="4444304522807523469">‏الدخول إلى الماسحات الضوئية للمستند الملحق عبر جهاز USB أو على الشبكة المحلية</translation>
@@ -2485,6 +2500,7 @@
 <translation id="4545759655004063573">لا يمكن الحفظ نظرًا لأن الأذونات غير كافية. الرجاء الحفظ في مكان آخر.</translation>
 <translation id="4547659257713117923">ليست هناك علامات تبويب من أجهزة أخرى</translation>
 <translation id="4547992677060857254">يشتمل المجلد المحدد على ملفات حساسة. فهل تريد بالتأكيد منح "$1" حق الدخول الدائم للكتابة في هذا المجلد؟س</translation>
+<translation id="4552495056028768700">الوصول إلى الصفحة</translation>
 <translation id="4552678318981539154">شراء المزيد من السعة التخزينية</translation>
 <translation id="4554591392113183336">الإضافة الخارجية في نفس الإصدار أو إصدار أقل مقارنة بالموجودة حاليًا.</translation>
 <translation id="4554796861933393312">‏سرعة الصور المتحركة لـ Ink Drop للتصميم متعدد الأبعاد</translation>
@@ -2753,6 +2769,7 @@
 <translation id="4920887663447894854">تم حظر تتبع المواقع التالية لموقعك في هذه الصفحة:</translation>
 <translation id="492322146001920322">إستراتيجية إصدار ضغط الذاكرة التقليدية</translation>
 <translation id="4923279099980110923">نعم، أريد تقديم المساعدة</translation>
+<translation id="4924202073934898868">‏تُمكن من استخدام AppContainer على معالجات وضع الحماية لتحسين الأمان.</translation>
 <translation id="4924638091161556692">تم الإصلاح</translation>
 <translation id="4925542575807923399">يحتاج مشرف هذا الحساب أن يكون هذا الحساب الأول في تسجيل الدخول إلى جلسة دخول متعدد.</translation>
 <translation id="4927301649992043040">إنشاء حزمة للإضافة</translation>
@@ -3267,6 +3284,7 @@
 <translation id="5662457369790254286">‏يضبط الصور المتحركة لشريط التقدم لتحميل الصفحات لهاتف يعمل بنظام Android</translation>
 <translation id="5663459693447872156">الانتقال تلقائيًا إلى منتصف العرض</translation>
 <translation id="5669267381087807207">تنشيط</translation>
+<translation id="5669462439438204699">حفظ بطاقة الائتمان</translation>
 <translation id="5671961047338275645">إدارة المواقع</translation>
 <translation id="5673305876422468017">تمكين النافذة المنبثقة لتوضيح الرابط.</translation>
 <translation id="5676267133227121599">الوصول إلى كلمات المرور من أي جهاز في <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3459,6 +3477,7 @@
 <translation id="5941343993301164315">الرجاء تسجيل الدخول إلى <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">تصغير</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">تعطيل مربع اختيار تبسيط الصفحة في مربع حوار معاينة الطباعة</translation>
 <translation id="5945992478690277605">تمكين إطار العرض الظاهري للقرص</translation>
 <translation id="5946591249682680882">معرف التقرير: <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">إضافة شبكة خاصة</translation>
@@ -3550,11 +3569,14 @@
 <translation id="6083557600037991373">لزيادة سرعة صفحات الويب، فإن <ph name="PRODUCT_NAME" />
 يحفظ الملفات التي تم تنزيلها على القرص مؤقتًا. عند إيقاف تشغيل <ph name="PRODUCT_NAME" /> بشكل غير صحيح، يمكن أن تتلف هذه الملفات، مما يؤدي إلى حدوث هذا الخطأ.  ستؤدي إعادة تحميل الصفحة إلى حل هذه المشكلة، وسيحول إيقاف تشغيله على نحو صحيح دون حدوثها في المستقبل.<ph name="LINE_BREAK" /> في حالة استمرار المشكلة، جرّب محو ذاكرة التخزين المؤقت.  وفي بعض الحالات، قد يكون هذا أيضًا عرضًا لبدء إخفاق الجهاز.</translation>
 <translation id="6084983096586510630">اتصالات الطرف الأول فقط</translation>
+<translation id="6086814797483779854">تشغيل عند النقر</translation>
 <translation id="6086846494333236931">تم التثبيت من قبل مشرفك</translation>
+<translation id="6088898411501370207">‏لا يدعم كل من العميل والخادم مجموعة تشفير أو إصدار بروتوكول طبقة المقابس الآمنة الشائع. ويحدث هذا عادةً عندما يحتاج الخادم إلى دعم RC4، الذي تمت إزالته.</translation>
 <translation id="6089481419520884864">صفحة التنقية</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">تم التحقق من صلاحية بطاقتك</translation>
 <translation id="6093888419484831006">جارٍ إلغاء التحديث...</translation>
+<translation id="6094826672794738469">Alternative Services.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">فتح في وضع التكبير</translation>
 <translation id="6096326118418049043">‏اسم X.500</translation>
@@ -3703,7 +3725,6 @@
 <translation id="6333834492048057036">تركيز شريط العناوين للبحث</translation>
 <translation id="6339034549827494595">‏لوحة المفاتيح الروسية الصوتية (AATSEEL)</translation>
 <translation id="6341850831632289108">اكتشاف موقعك الفعلي</translation>
-<translation id="6342069812937806050">الآن</translation>
 <translation id="634208815998129842">إدارة المهام</translation>
 <translation id="6344170822609224263">قائمة الدخول لاتصالات الشبكة</translation>
 <translation id="6344783595350022745">محو النص</translation>
@@ -3753,6 +3774,7 @@
 <translation id="6417515091412812850">تعذر التحقق مما إذا كانت الشهادة قد تم إبطالها.</translation>
 <translation id="6418160186546245112">العودة إلى الإصدار المثبتة سابقًا من <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">إزالة الدخول لجميع التطبيقات نهائيًا</translation>
+<translation id="6419708387665252597">تعطيل تبسيط الصفحة في معاينة الطباعة</translation>
 <translation id="6419902127459849040">وسط أوروبا</translation>
 <translation id="6420676428473580225">إضافة إلى سطح المكتب</translation>
 <translation id="6422329785618833949">تم قلب الصورة</translation>
@@ -3878,6 +3900,7 @@
 <translation id="6588399906604251380">تمكين التدقيق الإملائي</translation>
 <translation id="6589706261477377614">زيادة سطوع المفاتيح</translation>
 <translation id="6592267180249644460">‏تم التقاط سجلات WebRTC في <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">أقل من <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">الأفضل</translation>
 <translation id="6596092346130528198">هل هذه هي صفحة علامة التبويب الجديدة التي كنت تتوقع ظهورها؟</translation>
 <translation id="6596325263575161958">خيارات التشفير</translation>
@@ -4095,6 +4118,7 @@
 <translation id="6948736568813450284">‏بالنسبة إلى مطوِّري البرامج: يمكن استخدام خدمة وضع الحماية مع مكالمات واجهة برمجة تطبيقات Google Payments.</translation>
 <translation id="6949306908218145636">وضع إشارة مرجعية على الصفحات المفتوحة...</translation>
 <translation id="695164542422037736">‏عند تمكين هذا الخيار، وعندما يتم اختيار نمط background-attachment:fixed للنص الأساسي، سيكون للخلفية طبقتها المركبة الخاصة.</translation>
+<translation id="6952626679169241027">يتذكر <ph name="PASSWORD_MANAGER_BRAND" /> كلمات المرور ويسجل دخولك إلى المواقع تلقائيًا على هذا الجهاز.</translation>
 <translation id="6954850746343724854">‏تمكين Native Client لجميع تطبيقات الويب، حتى التطبيقات التي لم يتم تثبيتها من سوق Chrome الإلكتروني.</translation>
 <translation id="6955446738988643816">فحص النوافذ المنبثقة</translation>
 <translation id="695755122858488207">زر اختيار غير محدد</translation>
@@ -4152,6 +4176,7 @@
 <translation id="7015226785571892184">سيتم تشغيل التطبيق التالي في حالة قبول هذا الطلب:
 
  <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">‏يتم استخدام إقران Weave من خلال تطبيق Weave للاتصال الآمن مع الأجهزة على الشبكة المحلية.</translation>
 <translation id="7017004637493394352">‏قل "Ok Google" مرة أخرى</translation>
 <translation id="7017219178341817193">إضافة صفحة جديدة</translation>
 <translation id="7017354871202642555">لا يمكن تعيين الوضع بعد تعيين النافذة.</translation>
@@ -4488,6 +4513,7 @@
 <translation id="7503191893372251637">‏نوع شهادات Netscape</translation>
 <translation id="7503821294401948377">تعذر تحميل رمز '<ph name="ICON" />' لإجراء المتصفح.</translation>
 <translation id="750413812607578381">تجب إعادة تشغيل <ph name="PRODUCT_NAME" /> الآن.</translation>
+<translation id="7504483980780085481">قدم هذا الموقع معلومات غير صالحة لشفافية الشهادة.</translation>
 <translation id="7504676042960447229">يريد <ph name="SITE_NAME" /> أن:</translation>
 <translation id="750509436279396091">فتح مجلد التنزيلات</translation>
 <translation id="7505167922889582512">إظهار الملفات المخفية</translation>
@@ -4641,6 +4667,7 @@
 <translation id="7717536746040464035">‏تمكين وضع حماية جهاز عرض seccomp-BPF</translation>
 <translation id="7719421816612904796">انتهاء وقت التدريب</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7721392263035281016">‏تعذر إنشاء اتصال آمن؛ نظرًا لأن هذا الموقع يستخدم بروتوكولاً غير مدعوم أو مجموعة تشفير غير مدعومة. ويحدث هذا عادةً عندما يحتاج الخادم إلى دعم RC4، الذي تمت إزالته.</translation>
 <translation id="7724603315864178912">قص</translation>
 <translation id="7730449930968088409">التقاط محتوى الشاشة</translation>
 <translation id="7730494089396812859">عرض تفاصيل النسخ الاحتياطي عبر السحاب</translation>
@@ -4741,6 +4768,7 @@
 <translation id="7864539943188674973">تعطيل البلوتوث</translation>
 <translation id="7870790288828963061">‏لا توجد إصدارات أحدث لتطبيق Kiosk. لا يوجد شيء لتحديثه. يُرجى إزالة جهاز USB.</translation>
 <translation id="787150342916295244">المسح الضوئي لبطاقة الائتمان</translation>
+<translation id="7874357055309047713">تشغيل على جميع المواقع دائمًا</translation>
 <translation id="7876243839304621966">إزالة الكل</translation>
 <translation id="7877451762676714207">خطأ غير معروف في الخادم. الرجاء إعادة المحاولة أو الاتصال بمشرف الخادم.</translation>
 <translation id="7878999881405658917">‏لقد أرسلت Google إشعارًا إلى هذا الهاتف. تجدر الإشارة إلى أنه يمكن لهاتفك باستخدام البلوتوث أن يحتفظ بإلغاء قفل <ph name="DEVICE_TYPE" /> من على بُعد أكثر من 30 قدمًا. إذا أحدث ذلك مشكلة لك، يمكنك &lt;a&gt; تعطيل هذه الميزة مؤقتًا&lt;/a&gt;.</translation>
@@ -4780,6 +4808,7 @@
 <translation id="7918257978052780342">تسجيل</translation>
 <translation id="7920092496846849526">هل سألت والديك ما إذا كان مناسبًا لك زيارة هذه الصفحة.</translation>
 <translation id="7925285046818567682">في انتظار <ph name="HOST_NAME" />‏ ...</translation>
+<translation id="7925425262460550824">يتذكر <ph name="PASSWORD_MANAGER_BRAND" /> كلمات المرور ويسجل دخولك إلى التطبيقات والمواقع تلقائيًا عبر الأجهزة.</translation>
 <translation id="7925686952655276919">عدم استخدام بيانات الجوال للمزامنة</translation>
 <translation id="7926906273904422255">وضع علامة على الأصول غير الآمنة كغير آمنة، أو "مشكوك فيها".</translation>
 <translation id="7928710562641958568">إخراج الجهاز</translation>
@@ -4968,6 +4997,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">صفحة</translation>
 <translation id="8180786512391440389">يمكن لـ "<ph name="EXTENSION" />" قراءة الصور ومقاطع الفيديو وملفات الصوت في المواقع المحددة وحذفها.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{لا شيء}=1{عنصر واحد}two{عنصران (#)}few{# عناصر}many{# عنصرًا}other{# عنصر}}</translation>
 <translation id="8184538546369750125">استخدام الإعداد الافتراضي العمومي (سماح)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - المالك</translation>
 <translation id="8185331656081929126">عرض إشعارات عند اكتشاف طابعات جديدة على الشبكة</translation>
@@ -5033,6 +5063,7 @@
 <translation id="8263231521757761563">معالجات البروتوكول النشطة</translation>
 <translation id="8263744495942430914">عطّل <ph name="FULLSCREEN_ORIGIN" /> مؤشر الماوس.</translation>
 <translation id="8264718194193514834">شغّلت الإضافة <ph name="EXTENSION_NAME" /> وضع ملء الشاشة.</translation>
+<translation id="8267698848189296333">تسجيل الدخول باسم <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في قائمة "المزيد من الأدوات".</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> في وضع ملء الشاشة الآن ويريد تعطيل مؤشر الماوس.</translation>
 <translation id="8275038454117074363">الاستيراد</translation>
@@ -5146,6 +5177,8 @@
 <translation id="8435334418765210033">الشبكات المسجّلة</translation>
 <translation id="8437209419043462667">الأمريكية</translation>
 <translation id="843730695811085446">‏تُمكن إطار نمط تطبيق الويب للتطبيقات المستضافة، بما في ذلك تطبيقات الإشارات المرجعية. هذا حاليًا غير متاح إلا لـ Ash.</translation>
+<translation id="8437331208797669910">الوصول إلى الصفحة</translation>
+<translation id="843760761634048214">حفظ بطاقة الائتمان</translation>
 <translation id="8438601631816548197">حول البحث الصوتي</translation>
 <translation id="8439506636278576865">عرض ترجمة الصفحات المكتوبة بهذه اللغة</translation>
 <translation id="8442065444327205563">المستند جاهز للعرض.</translation>
@@ -5564,6 +5597,7 @@
 <translation id="9039890312082871605">تجاهل علامات التبويب</translation>
 <translation id="9040185888511745258">قد يحاول المهاجمون في <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> خداعك من خلال تثبيت برامج تضر بتجربة التصفح (على سبيل المثال، من خلال تغيير صفحتك الرئيسية أو عرض إعلانات إضافية على المواقع التي تزورها).</translation>
 <translation id="9040421302519041149">الدخول إلى هذه الشبكة محمي.</translation>
+<translation id="9040967476106479091">اختيار حسابك من <ph name="PASSWORD_MANAGER_BRAND" /> لتسجيل الدخول</translation>
 <translation id="9041603713188951722">عرض الإعدادات في نافذة</translation>
 <translation id="904451693890288097">الرجاء إدخال مفتاح المرور لـ "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">لم تعد صفحة الويب على <ph name="URL" /> موجودة.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 8aea76c5..62c844c 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -3700,7 +3700,6 @@
 <translation id="6333834492048057036">Преместване на фокуса върху адресната лента за търсене</translation>
 <translation id="6339034549827494595">Руска фонетична клавиатура (AATSEEL)</translation>
 <translation id="6341850831632289108">Откриване на физическото ви местоположение</translation>
-<translation id="6342069812937806050">Току-що</translation>
 <translation id="634208815998129842">Диспечер на задачите</translation>
 <translation id="6344170822609224263">Достъп до списъка с мрежови връзки</translation>
 <translation id="6344783595350022745">Изчистване на текста</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 5e6b079..7fd85e8f 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -3713,7 +3713,6 @@
 <translation id="6333834492048057036">অনুসন্ধানের জন্য ঠিকানা দণ্ডের উপর নজর রাখুন</translation>
 <translation id="6339034549827494595">রাশিয়ান ফোনেটিক (AATSEEL) কীবোর্ড</translation>
 <translation id="6341850831632289108">আপনার শারীরিক অবস্থান সনাক্ত করুন</translation>
-<translation id="6342069812937806050">এখনই</translation>
 <translation id="634208815998129842">কার্য পরিচালক</translation>
 <translation id="6344170822609224263">নেটওয়ার্ক সংযোগের তালিকা অ্যাক্সেস করে</translation>
 <translation id="6344783595350022745">পাঠ্য সাফ করুন</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 91d5417..fb77f7b9 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -3711,7 +3711,6 @@
 <translation id="6333834492048057036">Se centra en la barra d'adreces per fer una cerca.</translation>
 <translation id="6339034549827494595">Teclat fonètic rus (AATSEEL)</translation>
 <translation id="6341850831632289108">Detecteu la vostra ubicació física</translation>
-<translation id="6342069812937806050">Ara mateix</translation>
 <translation id="634208815998129842">Gestor de tasques</translation>
 <translation id="6344170822609224263">Accedir a la llista de connexions de xarxa</translation>
 <translation id="6344783595350022745">Esborra el text</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 340ba67..090d960c 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1725,7 +1725,7 @@
 <translation id="3445830502289589282">Ověření Phase 2:</translation>
 <translation id="3445925074670675829">Zařízení USB Type-C</translation>
 <translation id="344630545793878684">Čtení vašich dat na mnoha webech</translation>
-<translation id="3447661539832366887">Vlastník tohoto zařízení vypnul hru s dinosaury.</translation>
+<translation id="3447661539832366887">Vlastník tohoto zařízení hru s dinosaurem vypnul.</translation>
 <translation id="3449839693241009168">Stiskem klávesy <ph name="SEARCH_KEY" /> odešlete příkazy pro rozšíření <ph name="EXTENSION_NAME" /></translation>
 <translation id="3450157232394774192">Procentuální zastoupení stavu nečinnosti</translation>
 <translation id="3450505713373650336">Probíhá zálohování <ph name="FILE_COUNT" /> fotek</translation>
@@ -3706,7 +3706,6 @@
 <translation id="6333834492048057036">Přejít na adresní řádek za účelem vyhledávání</translation>
 <translation id="6339034549827494595">Ruská fonetická klávesnice (AATSEEL)</translation>
 <translation id="6341850831632289108">Určit vaše fyzické umístění</translation>
-<translation id="6342069812937806050">Právě teď</translation>
 <translation id="634208815998129842">Správce úloh</translation>
 <translation id="6344170822609224263">Zobrazení seznamu síťových připojení</translation>
 <translation id="6344783595350022745">Smazat text</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index ac2f305..7346b99b 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -3720,7 +3720,6 @@
 <translation id="6333834492048057036">Fokuser adresselinje i søgetilstand</translation>
 <translation id="6339034549827494595">Russisk fonetisk (AATSEEL) tastatur</translation>
 <translation id="6341850831632289108">Find din fysiske placering</translation>
-<translation id="6342069812937806050">Lige nu</translation>
 <translation id="634208815998129842">Jobliste</translation>
 <translation id="6344170822609224263">Få adgang til listen over netværksforbindelser</translation>
 <translation id="6344783595350022745">Ryd tekst</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 561612c..8cef229 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -3695,7 +3695,6 @@
 <translation id="6333834492048057036">Adressleiste für die Suche fokussieren</translation>
 <translation id="6339034549827494595">Russische Tastatur (AATSEEL)</translation>
 <translation id="6341850831632289108">Ihren physischen Standort ermitteln</translation>
-<translation id="6342069812937806050">Abgeschlossen</translation>
 <translation id="634208815998129842">Task-Manager</translation>
 <translation id="6344170822609224263">Auf Liste der Netzwerkverbindungen zugreifen</translation>
 <translation id="6344783595350022745">Text entfernen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 2ceeac2..4b91100 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Ρύθμιση αυτόματων ενημερώσεων για όλους τους χρήστες</translation>
 <translation id="1079766198702302550">Να μην επιτρέπεται ποτέ η πρόσβαση στην κάμερα</translation>
+<translation id="1082398631555931481">Το <ph name="THIRD_PARTY_TOOL_NAME" /> θέλει να επαναφέρει τις ρυθμίσεις του Chrome στις αρχικές προεπιλογές. Αυτό θα επαναφέρει την αρχική σελίδα σας, τη σελίδα νέας καρτέλας και τη μηχανή αναζήτησης, θα απενεργοποιήσει τις επεκτάσεις σας και θα ξεκαρφιτσώσει όλες τις καρτέλες. Επίσης, θα εκκαθαρίσει προσωρινά δεδομένα και τα δεδομένα που αποθηκεύτηκαν στην προσωρινή μνήμη, όπως cookie, περιεχόμενο και δεδομένα ιστότοπων.</translation>
 <translation id="108346963417674655">Δεν είναι δυνατή η ασφαλής σύνδεση στο διακομιστή. Αυτός ο ιστότοπος ενδέχεται να λειτουργούσε στο παρελθόν, αλλά υπάρχει πρόβλημα με το διακομιστή. Η σύνδεση σε ιστότοπους αυτού του είδους ενέχει κινδύνους ασφαλείας για όλους τους χρήστες, επομένως ο ιστότοπος έχει απενεργοποιηθεί.</translation>
 <translation id="1084538181352409184">Ελέγξτε τις ρυθμίσεις του διακομιστή μεσολάβησης ή επικοινωνήστε με το διαχειριστή
           του δικτύου σας για να βεβαιωθείτε ότι ο διακομιστής μεσολάβησης λειτουργεί.
@@ -118,6 +119,7 @@
 </translation>
 <translation id="1156185823432343624">Ένταση ήχου: Σε σίγαση</translation>
 <translation id="1156689104822061371">Διάταξη πληκτρολογίου:</translation>
+<translation id="1158274711289833876">Ασφαλής σύνδεση TLS</translation>
 <translation id="1160536908808547677">Κατά τη μεγέθυνση, τα στοιχεία σταθερής θέσης και οι κλιμακούμενες γραμμές κύλισης προσαρτώνται σε αυτήν τη θύρα προβολής.</translation>
 <translation id="1161575384898972166">Συνδεθείτε στο <ph name="TOKEN_NAME" /> για εξαγωγή του πιστοποιητικού πελάτη.</translation>
 <translation id="1162223735669141505">Θα πρέπει να είναι ενεργοποιημένη η <ph name="BEGIN_LINK" />προσθήκη Native Client<ph name="END_LINK" /> προκειμένου να χρησιμοποιήσετε αυτήν τη λειτουργία.</translation>
@@ -145,6 +147,7 @@
 <translation id="1189418886587279221">Ενεργοποιήστε τις λειτουργίες προσβασιμότητας για να κάνετε τη συσκευή σας πιο εύχρηστη.</translation>
 <translation id="1190144681599273207">Για την ανάκτηση αυτού του αρχείου θα χρησιμοποιηθούν περίπου <ph name="FILE_SIZE" /> δεδομένων κινητής τηλεφωνίας.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Πρόσβαση σε ένα αρχείο που είναι αποθηκευμένο στον υπολογιστή σας}other{Πρόσβαση σε # αρχεία που είναι αποθηκευμένα στον υπολογιστή σας}}</translation>
+<translation id="1190855992966397019">Ενεργοποίηση κλειδώματος του AppContainer.</translation>
 <translation id="1195447618553298278">Άγνωστο σφάλμα.</translation>
 <translation id="1196338895211115272">Αποτυχία εξαγωγής ιδιωτικού κλειδιού.</translation>
 <translation id="1196789802623400962">Ενεργοποίηση/απενεργοποίηση της επιλογής επεξεργασίας με κίνηση στη σελίδα ρυθμίσεων για το εικονικό πληκτρολόγιο.</translation>
@@ -180,6 +183,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="123578888592755962">Δίσκος πλήρης</translation>
 <translation id="1240892293903523606">Επιθεώρηση DOM</translation>
+<translation id="1242633766021457174">Το <ph name="THIRD_PARTY_TOOL_NAME" /> θέλει να επαναφέρει τις ρυθμίσεις σας.</translation>
 <translation id="1243314992276662751">Μεταφόρτωση</translation>
 <translation id="1244303850296295656">Σφάλμα επέκτασης</translation>
 <translation id="1248269069727746712">Το <ph name="PRODUCT_NAME" /> χρησιμοποιεί τις ρυθμίσεις του διακομιστή μεσολάβησης της συσκευής σας για να συνδεθεί στο δίκτυο.</translation>
@@ -233,6 +237,7 @@
 <translation id="1338950911836659113">Γίνεται διαγραφή…</translation>
 <translation id="1339266338863469628">Προεπιλογή (επιλέξτε μόνο εσάς)</translation>
 <translation id="1340527397989195812">Δημιουργία αντιγράφων ασφαλείας μέσων από τη συσκευή με χρήση της εφαρμογής "Αρχεία".</translation>
+<translation id="1341988552785875222">Η τρέχουσα ταπετσαρία έχει οριστεί από το '<ph name="APP_NAME" />'. Ενδεχομένως να χρειαστεί να απεγκαταστήσετε το '<ph name="APP_NAME" />' πριν επιλέξετε μια διαφορετική ταπετσαρία.</translation>
 <translation id="1343517687228689568">Ξεκαρφίτσωμα αυτής της σελίδας από την Οθόνη έναρξης…</translation>
 <translation id="1344519653668879001">Απενεργοποίηση ελέγχου υπερσυνδέσμου</translation>
 <translation id="1346104802985271895">Μέθοδος εισαγωγής Βιετναμέζικων (TELEX)</translation>
@@ -989,6 +994,7 @@
 <translation id="2421956571193030337">Χρησιμοποιήστε αυτήν τη δυνατότητα μόνο με λογαριασμούς που θεωρείτε αξιόπιστους.</translation>
 <translation id="2422426094670600218">&lt;χωρίς όνομα&gt;</translation>
 <translation id="2423578206845792524">Αποθήκευση εικόνας &amp;ως...</translation>
+<translation id="2424091190911472304">Να εκτελείται πάντα στο <ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">Προσθήκη μιας παραμέτρου ερωτήματος στη διεύθυνση URL για την αυτόματη ανανέωση της σελίδας: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Εμφάνιση</translation>
 <translation id="2433728760128592593">Πατήστε Alt + Shift για εναλλαγή μεταξύ των μεθόδων εισαγωγής.</translation>
@@ -1308,6 +1314,7 @@
 <translation id="2841837950101800123">Πάροχος</translation>
 <translation id="2843055980807544929">Εάν είναι απενεργοποιημένο, το Chrome θα χειριστεί το WM_KEY* και το WM_CHAR ξεχωριστά.</translation>
 <translation id="2843806747483486897">Αλλαγή προεπιλογής...</translation>
+<translation id="2844111009524261443">Εκτέλεση με κλικ</translation>
 <translation id="2845382757467349449">Διαρκής εμφάνιση γραμμής σελιδοδεικτών</translation>
 <translation id="2846816712032308263">Ενεργοποιεί το γρήγορο κλείσιμο καρτέλας/παραθύρου - εκτελεί το δείκτη χειρισμού onunload js μιας καρτέλας ανεξάρτητα από το GUI.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1387,6 +1394,7 @@
 <translation id="2937174152333875430">Ενεργοποίηση συγχρονισμού εφαρμογής εκκίνησης</translation>
 <translation id="2938225289965773019">Άνοιγμα συνδέσμων <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">Μογγολικά</translation>
+<translation id="2941479658084239256">Ενεργοποίηση τοπικής αποθήκευσης σελίδων για χρήση εκτός σύνδεσης.</translation>
 <translation id="2942290791863759244">Πληκτρολόγιο Γερμανικών Neo 2</translation>
 <translation id="2943400156390503548">Διαφάνειες</translation>
 <translation id="2946119680249604491">Προσθήκη σύνδεσης</translation>
@@ -1408,6 +1416,7 @@
 <translation id="2966598748518102999">Βελτίωση της φωνητικής αναζήτησης με την αποστολή του ήχου "OK Google" και των ήχων που προηγήθηκαν για λίγα δευτερόλεπτα στην Google.</translation>
 <translation id="2967544384642772068">Τερματισμός</translation>
 <translation id="2968792643335932010">Λιγότερα αντίγραφα</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">μείωση φωτεινότητας</translation>
 <translation id="2972557485845626008">Υλικολογισμικό</translation>
 <translation id="2972581237482394796">&amp;Επανάληψη ενέργειας</translation>
@@ -1470,6 +1479,7 @@
 <translation id="3064388234319122767">Μεταγραφή (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Σχόλια για απότομο κλείσιμο καρτέλας.</translation>
 <translation id="3065140616557457172">Πληκτρολογήστε για αναζήτηση ή εισαγάγετε μια διεύθυνση URL για πλοήγηση - όλα είναι δυνατά.</translation>
+<translation id="3065351588762546748">Η σύνδεση σε αυτόν τον ιστότοπο χρησιμοποιεί μια ισχυρή έκδοση πρωτοκόλλου και σουίτας κρυπτογράφησης.</translation>
 <translation id="3067198360141518313">Εκτέλεση αυτής της προσθήκης</translation>
 <translation id="3075239840551149663">Δημιουργήθηκε το προφίλ εποπτευόμενου χρήστη <ph name="NEW_PROFILE_NAME" />!</translation>
 <translation id="3075874217500066906">Απαιτείται επανεκκίνηση προκειμένου να ξεκινήσει η διαδικασία Powerwash. Μετά την επανεκκίνηση, θα σας ζητηθεί να επιβεβαιώσετε ότι θέλετε να συνεχίσετε.</translation>
@@ -1651,6 +1661,7 @@
 <translation id="3308006649705061278">Οργανωτική ομάδα (OU)</translation>
 <translation id="3308116878371095290">Σε αυτήν τη σελίδα δεν έχει επιτραπεί ο ορισμός των cookie.</translation>
 <translation id="3308134619352333507">Απόκρυψη κουμπιού</translation>
+<translation id="3309747692199697901">Να εκτελείται πάντα σε όλους τους ιστότοπους</translation>
 <translation id="3313590242757056087">Για να ορίσετε τους ιστότοπους που μπορεί να επισκέπτεται ο εποπτευόμενος χρήστης, μπορείτε να διαμορφώσετε τους περιορισμούς
     και άλλες ρυθμίσεις από τη διεύθυνση <ph name="MANAGEMENT_URL" />.
     Αν δεν αλλάξετε τις προεπιλεγμένες ρυθμίσεις, ο χρήστης <ph name="USER_DISPLAY_NAME" />
@@ -1729,6 +1740,7 @@
 <translation id="3423858849633684918">Επανεκκινήστε το <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Προσδιορίστε τον αριθμό των νημάτων raster.</translation>
 <translation id="3428010780253032925">Απενεργοποίηση στόχευσης βάσει ορθογωνίου στις προβολές</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{τουλάχιστον ένα στοιχείο στις συγχρονισμένες συσκευές}=1{1 στοιχείο (και περισσότερα στις συγχρονισμένες συσκευές)}other{# στοιχεία (και περισσότερα στις συγχρονισμένες συσκευές)}}</translation>
 <translation id="3429599832623003132">$1 στοιχεία</translation>
 <translation id="3433621910545056227">Ωχ!  Το σύστημα απέτυχε να εφαρμόσει το κλείδωμα χρόνου εγκατάστασης χαρακτηριστικών.</translation>
 <translation id="343467364461911375">Ορισμένες υπηρεσίες περιεχομένου χρησιμοποιούν αναγνωριστικά υπολογιστή προκειμένου να σας ταυτοποιήσουν, για λόγους εξουσιοδότησης πρόσβασης σε προστατευμένο περιεχόμενο.</translation>
@@ -2006,6 +2018,7 @@
 <translation id="3759933321830434300">Αποκλεισμός τμημάτων ιστοσελίδων</translation>
 <translation id="3760460896538743390">Έλεγχος &amp;σελίδας παρασκηνίου</translation>
 <translation id="37613671848467444">Άνοιγμα σε παράθυρο ανώνυμης περιήγησης</translation>
+<translation id="3763401818161139108">Να εκτελείται πάντα στο <ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Επικοινωνία με μια συσκευή USB}other{Επικοινωνία με # συσκευές USB}}</translation>
 <translation id="3764800135428056022">Πρόταση αποθήκευσης των κωδικών σας πρόσβασης στον ιστό.</translation>
 <translation id="3764986667044728669">Δεν είναι δυνατή η εγγραφή</translation>
@@ -2231,6 +2244,7 @@
 <translation id="409579654357498729">Προσθήκη στο Cloud Print</translation>
 <translation id="4096508467498758490">Απενεργοποίηση επεκτάσεων λειτουργίας προγραμματιστή</translation>
 <translation id="4098354747657067197">Ακολουθεί παραπλανητικός ιστότοπος</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{κανένα}=1{1}other{#}}</translation>
 <translation id="409980434320521454">Ο συγχρονισμός απέτυχε</translation>
 <translation id="4103763322291513355">Επισκεφτείτε την &lt;strong&gt;chrome://policy&lt;/strong&gt; για να δείτε τη λίστα των ανεπιθύμητων διευθύνσεων URL και άλλες πολιτικές που έχουν τεθεί σε εφαρμογή από το διαχειριστή του συστήματός σας.</translation>
 <translation id="4104163789986725820">Ε&amp;ξαγωγή...</translation>
@@ -2444,6 +2458,7 @@
 <translation id="4439318412377770121">Θέλετε να κάνατε εγγραφή του <ph name="DEVICE_NAME" /> στις Συσκευές Google Cloud;</translation>
 <translation id="4441124369922430666">Θέλετε να ξεκινά αυτόματα αυτή η εφαρμογή όταν η συσκευή τίθεται σε λειτουργία;</translation>
 <translation id="444134486829715816">Ανάπτυξη...</translation>
+<translation id="4442309605992420742">Ενεργοποίηση σύζευξης Weave</translation>
 <translation id="444267095790823769">Εξαιρέσεις προστατευόμενου περιεχομένου</translation>
 <translation id="4443536555189480885">&amp;Βοήθεια</translation>
 <translation id="4444304522807523469">Πρόσβαση στους σαρωτές εγγράφων που προσαρτώνται μέσω USB ή σε κάποιο τοπικό δίκτυο</translation>
@@ -2505,6 +2520,7 @@
 <translation id="4545759655004063573">Δεν είναι δυνατή η αποθήκευση λόγω ανεπαρκών αδειών. Κάντε αποθήκευση σε άλλη τοποθεσία.</translation>
 <translation id="4547659257713117923">Δεν υπάρχουν καρτέλες από άλλες συσκευές</translation>
 <translation id="4547992677060857254">Ο φάκελος που επιλέξατε περιέχει ευαίσθητα αρχεία. Είστε σίγουροι ότι θέλετε να παραχωρήσετε στο "$1" μόνιμη πρόσβαση εγγραφής σε αυτόν το φάκελο;</translation>
+<translation id="4552495056028768700">Πρόσβαση στη σελίδα</translation>
 <translation id="4552678318981539154">Αγοράστε περισσότερο αποθηκευτικό χώρο</translation>
 <translation id="4554591392113183336">Η εξωτερική επέκταση είναι στην ίδια ή προγενέστερη έκδοση σε σύγκριση με την υπάρχουσα.</translation>
 <translation id="4554796861933393312">Ταχύτητα κινούμενης εικόνας σταγόνας μελανιού Material Design</translation>
@@ -2776,6 +2792,7 @@
 <translation id="4920887663447894854">Οι ακόλουθοι ιστότοποι έχουν αποκλειστεί από την παρακολούθηση της τοποθεσίας σας σε αυτήν τη σελίδα.</translation>
 <translation id="492322146001920322">Στρατηγική συντηρητικής απελευθέρωσης πίεσης μνήμης</translation>
 <translation id="4923279099980110923">Ναι, θέλω να βοηθήσω</translation>
+<translation id="4924202073934898868">Ενεργοποιεί τη χρήση ενός AppContainer σε διαδικασίες περιβάλλοντος δοκιμών για την βελτίωση της ασφάλειας.</translation>
 <translation id="4924638091161556692">Διορθώθηκε</translation>
 <translation id="4925542575807923399">Ο διαχειριστής αυτού του λογαριασμού απαιτεί ο συγκεκριμένος λογαριασμός να είναι ο πρώτος λογαριασμός που συνδέεται σε μια περίοδο σύνδεσης πολλαπλών συνδέσεων.</translation>
 <translation id="4927301649992043040">Στοίβαξη επέκτασης</translation>
@@ -3295,6 +3312,7 @@
 <translation id="5662457369790254286">Διαμορφώνει την κινούμενη εικόνα γραμμής προόδου φόρτωσης σελίδας τηλεφώνου Android.</translation>
 <translation id="5663459693447872156">Αυτόματη εναλλαγή σε μισό πλάτος</translation>
 <translation id="5669267381087807207">Ενεργοποίηση</translation>
+<translation id="5669462439438204699">Αποθήκευση πιστωτικής κάρτας</translation>
 <translation id="5671961047338275645">Διαχείριση ιστότοπων</translation>
 <translation id="5673305876422468017">Ενεργοποίηση αναδυόμενου παράθυρου αποσαφήνισης συνδέσμου.</translation>
 <translation id="5676267133227121599">Δείτε τους κωδικούς πρόσβασής σας από οποιαδήποτε συσκευή στη διεύθυνση <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3489,6 +3507,7 @@
 <translation id="5941343993301164315">Συνδεθείτε στο <ph name="TOKEN_NAME" /> .</translation>
 <translation id="5941711191222866238">Ελαχιστοποίηση</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Απενεργοποίηση του πλαισίου ελέγχου απλοποίησης σελίδας στο παράθυρο διαλόγου προεπισκόπησης εκτύπωσης</translation>
 <translation id="5945992478690277605">Ενεργοποίηση τσιμπήματος εικονικής θύρας προβολής.</translation>
 <translation id="5946591249682680882">Αναγνωριστικό αναφοράς <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Προσθήκη ιδιωτικού δικτύου</translation>
@@ -3587,11 +3606,14 @@
        <ph name="LINE_BREAK" />
        Εάν το πρόβλημα παραμένει, δοκιμάστε να διαγράψετε την προσωρινή μνήμη.  Σε μερικές περιπτώσεις, αυτό ενδέχεται να αποτελεί επίσης σύμπτωμα υλικού που αρχίζει να χαλάει.</translation>
 <translation id="6084983096586510630">Μόνο συνδέσεις πρώτου μέρους</translation>
+<translation id="6086814797483779854">Εκτέλεση με κλικ</translation>
 <translation id="6086846494333236931">Εγκαταστάθηκε από το διαχειριστή σας</translation>
+<translation id="6088898411501370207">Ο υπολογιστής-πελάτης και ο διακομιστής δεν υποστηρίζουν κάποια κοινή έκδοση πρωτοκόλλου SSL ή κάποια σουίτα κρυπτογράφησης. Αυτό συνήθως συμβαίνει όταν ο διακομιστής χρειάζεται υποστήριξη RC4 η οποία έχει καταργηθεί.</translation>
 <translation id="6089481419520884864">Φιλτράρισμα σελίδας</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Η κάρτα σας επαληθεύτηκε</translation>
 <translation id="6093888419484831006">Ακύρωση ενημέρωσης...</translation>
+<translation id="6094826672794738469">Εναλλακτικές υπηρεσίες.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Άνοιγμα μεγιστοποιημένης εφαρμογής</translation>
 <translation id="6096326118418049043">Όνομα X.500</translation>
@@ -3738,7 +3760,6 @@
 <translation id="6333834492048057036">Γραμμή διευθύνσεων εστίασης για αναζήτηση</translation>
 <translation id="6339034549827494595">Ρωσικό φωνητικό πληκτρολόγιο (AATSEEL)</translation>
 <translation id="6341850831632289108">Εντοπισμός της φυσικής σας τοποθεσίας</translation>
-<translation id="6342069812937806050">Πριν λίγο</translation>
 <translation id="634208815998129842">Διαχείριση εργασιών</translation>
 <translation id="6344170822609224263">Λίστα πρόσβασης για συνδέσεις δικτύου</translation>
 <translation id="6344783595350022745">Διαγραφή κειμένου</translation>
@@ -3788,6 +3809,7 @@
 <translation id="6417515091412812850">Δεν είναι δυνατόν να ελεγχθεί αν το πιστοποιητικό έχει ακυρωθεί.</translation>
 <translation id="6418160186546245112">Γίνεται επαναφορά στην προηγούμενη εγκατεστημένη έκδοση του <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">Οριστική κατάργηση πρόσβασης για όλες τις εφαρμογές</translation>
+<translation id="6419708387665252597">Απενεργοποίηση της απλοποίησης σελίδας στην προεπισκόπηση εκτύπωσης</translation>
 <translation id="6419902127459849040">Κεντρική Ευρώπη</translation>
 <translation id="6420676428473580225">Προσθήκη στην επιφάνεια εργασίας</translation>
 <translation id="6422329785618833949">Η φωτογραφία μετακινήθηκε</translation>
@@ -3916,6 +3938,7 @@
 <translation id="6588399906604251380">Ενεργοποίηση ορθογραφικού ελέγχου</translation>
 <translation id="6589706261477377614">Αύξηση φωτεινότητας πλήκτρων</translation>
 <translation id="6592267180249644460">Έγινε λήψη αρχείου καταγραφής WebRTC <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">λιγότερο από <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">βέλτιστη</translation>
 <translation id="6596092346130528198">Είναι αυτή η σελίδα σε νέα καρτέλα που περιμένατε να δείτε;</translation>
 <translation id="6596325263575161958">Επιλογές κρυπτογράφησης</translation>
@@ -4137,6 +4160,7 @@
 <translation id="6948736568813450284">Για προγραμματιστές: χρησιμοποιήστε την υπηρεσία περιβάλλοντος δοκιμών για κλήσεις API του Google Payments.</translation>
 <translation id="6949306908218145636">Δημιουργία σελιδοδεικτών για όλες τις ανοικτές σελίδες…</translation>
 <translation id="695164542422037736">Εάν είναι ενεργοποιημένη αυτή η επιλογή και το σώμα του κειμένου έχει μορφοποίηση background-attachment:fixed, το φόντο θα έχει το δικό του σύνθετο επίπεδο.</translation>
+<translation id="6952626679169241027">Το <ph name="PASSWORD_MANAGER_BRAND" /> διατηρεί τους κωδικούς πρόσβασής σας και σας συνδέει αυτόματα σε ιστότοπους σε αυτήν τη συσκευή.</translation>
 <translation id="6954850746343724854">Ενεργοποίηση του Native Client για όλες τις εφαρμογές ιστού, ακόμα και για αυτές που δεν έχουν εγκατασταθεί από το Chrome Web Store.</translation>
 <translation id="6955446738988643816">Έλεγχος αναδυόμενου παραθύρου</translation>
 <translation id="695755122858488207">Μη επιλεγμένο κουμπί επιλογής</translation>
@@ -4193,6 +4217,7 @@
 <translation id="7015226785571892184">Αν δεχθείτε αυτή την αίτηση θα γίνει εκκίνηση της ακόλουθης εφαρμογής:
 
  <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Η σύζευξη Weave χρησιμοποιείται από την εφαρμογή Weave για ασφαλή επικοινωνία με συσκευές σε τοπικό δίκτυο.</translation>
 <translation id="7017004637493394352">Εκφωνήστε ξανά "Ok Google"</translation>
 <translation id="7017219178341817193">Προσθήκη νέας σελίδας</translation>
 <translation id="7017354871202642555">Δεν είναι δυνατή η ρύθμιση της λειτουργίας μετά τη ρύθμιση του παράθυρου.</translation>
@@ -4530,6 +4555,7 @@
 <translation id="7503191893372251637">Τύπος πιστοποιητικού Netscape</translation>
 <translation id="7503821294401948377">Δεν ήταν δυνατή η φόρτωση του εικονιδίου "<ph name="ICON" />" για ενέργεια προγράμματος περιήγησης.</translation>
 <translation id="750413812607578381">Πρέπει να επανεκκινήσετε το <ph name="PRODUCT_NAME" /> τώρα.</translation>
+<translation id="7504483980780085481">Παρασχέθηκαν μη έγκυρες πληροφορίες διαφάνειας πιστοποιητικού από αυτόν τον ιστότοπο.</translation>
 <translation id="7504676042960447229">Ο ιστότοπος <ph name="SITE_NAME" /> επιθυμεί:</translation>
 <translation id="750509436279396091">Άνοιγμα φακέλου λήψεων</translation>
 <translation id="7505167922889582512">Εμφάνιση κρυφών αρχείων</translation>
@@ -4685,6 +4711,7 @@
 <translation id="7717536746040464035">Ενεργοποίηση περιβάλλοντος δοκιμών λειτουργίας απόδοσης seccomp-bpf</translation>
 <translation id="7719421816612904796">Το χρονικό όριο για την εκπαίδευση έληξε</translation>
 <translation id="771953673318695590">Εγγύηση Ποιότητας</translation>
+<translation id="7721392263035281016">Δεν είναι δυνατή η δημιουργία ασφαλούς σύνδεσης επειδή αυτός ο ιστότοπος χρησιμοποιεί ένα μη υποστηριζόμενο πρωτόκολλο ή σουίτα κρυπτογράφησης. Αυτό συνήθως συμβαίνει όταν ο διακομιστής χρειάζεται υποστήριξη RC4 η οποία έχει καταργηθεί.</translation>
 <translation id="7724603315864178912">Αποκοπή</translation>
 <translation id="7730449930968088409">Εγγραφή του περιεχομένου της οθόνης σας</translation>
 <translation id="7730494089396812859">Εμφάνιση λεπτομερειών αντιγράφου ασφαλείας στο cloud</translation>
@@ -4785,6 +4812,7 @@
 <translation id="7864539943188674973">Απενεργοποίηση Bluetooth</translation>
 <translation id="7870790288828963061">Δεν βρέθηκαν εφαρμογές kiosk με νεότερη έκδοση. Δεν υπάρχουν στοιχεία προς ενημέρωση. Αφαιρέστε τη συσκευή USB.</translation>
 <translation id="787150342916295244">Σάρωση πιστωτικής κάρτας</translation>
+<translation id="7874357055309047713">Να εκτελείται πάντα σε όλους τους ιστότοπους</translation>
 <translation id="7876243839304621966">Κατάργηση όλων</translation>
 <translation id="7877451762676714207">Άγνωστο σφάλμα διακομιστή. Δοκιμάστε ξανά ή επικοινωνήστε με τον διαχειριστή του διακομιστή.</translation>
 <translation id="7878999881405658917">Η Google έστειλε μια ειδοποίηση σε αυτό το τηλέφωνο. Έχετε υπόψη σας ότι με το Bluetooth, το τηλέφωνό σας μπορεί να διατηρεί ξεκλειδωμένη τη συσκευή <ph name="DEVICE_TYPE" /> από απόσταση μεγαλύτερη των εννιά μέτρων. Αν δεν το επιθυμείτε αυτό, μπορείτε να &lt;a&gt;απενεργοποιήσετε προσωρινά αυτήν τη λειτουργία&lt;/a&gt;.</translation>
@@ -4824,6 +4852,7 @@
 <translation id="7918257978052780342">Εγγραφή</translation>
 <translation id="7920092496846849526">Ρώτησες τους γονείς σου εάν σου επιτρέπουν να επισκεφτείς αυτήν τη σελίδα.</translation>
 <translation id="7925285046818567682">Αναμονή για κεντρικό υπολογιστή <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824">Το <ph name="PASSWORD_MANAGER_BRAND" /> διατηρεί τους κωδικούς πρόσβασής σας και σας συνδέει αυτόματα σε εφαρμογές και ιστότοπους σε όλες τις συσκευές.</translation>
 <translation id="7925686952655276919">Μη χρησιμοποιείτε δεδομένα για κινητά για συγχρονισμό</translation>
 <translation id="7926906273904422255">Επισημάνετε μη ασφαλείς προελεύσεις ως μη ασφαλείς ή ως "αμφίβολες".</translation>
 <translation id="7928710562641958568">Εξαγωγή συσκευής</translation>
@@ -5013,6 +5042,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">σελίδα</translation>
 <translation id="8180786512391440389">Η επέκταση "<ph name="EXTENSION" />" μπορεί να διαβάσει και να εγγράψει εικόνες, βίντεο και αρχεία ήχου σε επιλεγμένες τοποθεσίες.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{κανένα}=1{1 στοιχείο}other{# στοιχεία}}</translation>
 <translation id="8184538546369750125">Χρήση καθολικής προεπιλεγμένης ρύθμισης (Επιτρέπεται)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - Κάτοχος</translation>
 <translation id="8185331656081929126">Εμφάνιση ειδοποιήσεων κατά τον εντοπισμό νέων εκτυπωτών στο δίκτυο</translation>
@@ -5078,6 +5108,7 @@
 <translation id="8263231521757761563">Ενεργοί χειριστές πρωτοκόλλων</translation>
 <translation id="8263744495942430914">Το <ph name="FULLSCREEN_ORIGIN" /> έχει απενεργοποιήσει τον δείκτη του ποντικιού σας.</translation>
 <translation id="8264718194193514834">Η επέκταση "<ph name="EXTENSION_NAME" />" ενεργοποίησε τη λειτουργία πλήρους οθόνης.</translation>
+<translation id="8267698848189296333">Σύνδεση ως <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Διαχειριστείτε τις επεκτάσεις σας κάνοντας κλικ στο στοιχείο "Επεκτάσεις" στο μενού "Περισσότερα εργαλεία".</translation>
 <translation id="8273972836055206582">Το <ph name="FULLSCREEN_ORIGIN" /> εμφανίζεται σε πλήρη οθόνη και θέλει να απενεργοποιήσει τον δείκτη του ποντικιού σας.</translation>
 <translation id="8275038454117074363">Εισαγωγή</translation>
@@ -5193,6 +5224,8 @@
 <translation id="8435334418765210033">Απομνημονευμένα δίκτυα</translation>
 <translation id="8437209419043462667">ΗΠΑ</translation>
 <translation id="843730695811085446">Ενεργοποιεί το πλαίσιο στυλ εφαρμογών ιστού για φιλοξενούμενες εφαρμογές, συμπεριλαμβανομένων των εφαρμογών σελιδοδείκτη. Προς το παρόν διατίθεται μόνο για Ash.</translation>
+<translation id="8437331208797669910">Πρόσβαση στη σελίδα</translation>
+<translation id="843760761634048214">Αποθήκευση πιστωτικής κάρτας</translation>
 <translation id="8438601631816548197">Σχετικά με τη Φωνητική αναζήτηση</translation>
 <translation id="8439506636278576865">Ερώτηση για τη μετάφραση σελίδων σε αυτήν τη γλώσσα</translation>
 <translation id="8442065444327205563">Το έγγραφό σας είναι έτοιμο.</translation>
@@ -5614,6 +5647,7 @@
 <translation id="9039890312082871605">Σίγαση καρτελών</translation>
 <translation id="9040185888511745258">Όσοι εισβάλλουν στο <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> μπορεί να προσπαθήσουν να σας ξεγελάσουν ώστε να εγκαταστήσετε προγράμματα που βλάπτουν την εμπειρία περιήγησής σας (για παράδειγμα, αλλάζοντας την αρχική σελίδα σας ή εμφανίζοντας επιπλέον διαφημίσεις στους ιστότοπους που επισκέπτεστε).</translation>
 <translation id="9040421302519041149">Η πρόσβαση σε αυτό το δίκτυο έχει προστασία.</translation>
+<translation id="9040967476106479091">Επιλέξτε τον κωδικό πρόσβασής σας από το <ph name="PASSWORD_MANAGER_BRAND" /> για να συνδεθείτε</translation>
 <translation id="9041603713188951722">Εμφάνιση ρυθμίσεων σε παράθυρο</translation>
 <translation id="904451693890288097">Εισαγάγετε το κλειδί πρόσβασης για τη συσκευή "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">Η ιστοσελίδα στο <ph name="URL" /> δεν υπάρχει πια.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 2fe378b..fc78d72 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Set Up Automatic Updates for All Users</translation>
 <translation id="1079766198702302550">Always block camera access</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> wants to restore your Chrome settings to their original defaults. This will reset your homepage, new tab page and search engine, disable your extensions and unpin all tabs. It will also clear other temporary and cached data, such as cookies, content and site data.</translation>
 <translation id="108346963417674655">Unable to connect securely to the server. This website may have worked previously, but there is a problem with the server. Connecting to such sites weakens security for all users and thus has been disabled.</translation>
 <translation id="1084538181352409184">Check your proxy settings or contact your network administrator to
           make sure the proxy server is working.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">Catalan</translation>
 <translation id="1156185823432343624">Volume: Muted</translation>
 <translation id="1156689104822061371">Keyboard Layout:</translation>
+<translation id="1158274711289833876">Secure TLS connection</translation>
 <translation id="1160536908808547677">When zoomed in, fixed-position elements and scaled scrollbars attach to this viewport.</translation>
 <translation id="1161575384898972166">Please sign in to <ph name="TOKEN_NAME" /> to export the client certificate.</translation>
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Native Client plugin<ph name="END_LINK" /> needs to be enabled to use this feature.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">Enable accessibility features to make your device easier to use.</translation>
 <translation id="1190144681599273207">Fetching this file will use approximately <ph name="FILE_SIZE" /> of mobile data.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Access a file stored on your computer}other{Access # files stored on your computer}}</translation>
+<translation id="1190855992966397019">Enable AppContainer Lockdown.</translation>
 <translation id="1195447618553298278">Unknown error.</translation>
 <translation id="1196338895211115272">Failed to export private key.</translation>
 <translation id="1196789802623400962">Enable/Disable gesture editing option in the settings page for the virtual keyboard.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="123578888592755962">Disk full</translation>
 <translation id="1240892293903523606">DOM inspector</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> wants to reset your settings.</translation>
 <translation id="1243314992276662751">Upload</translation>
 <translation id="1244303850296295656">Extension error</translation>
 <translation id="1248269069727746712"><ph name="PRODUCT_NAME" /> is using your device's system proxy settings to connect to the network.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">Deleting...</translation>
 <translation id="1339266338863469628">Default (pick up just you)</translation>
 <translation id="1340527397989195812">Back up media from the device using the Files app.</translation>
+<translation id="1341988552785875222">The current wallpaper is set by '<ph name="APP_NAME" />'. You may need to uninstall '<ph name="APP_NAME" />' before selecting a different wallpaper.</translation>
 <translation id="1343517687228689568">Unpin this page from Start screen...</translation>
 <translation id="1344519653668879001">Disable hyperlink auditing</translation>
 <translation id="1346104802985271895">Vietnamese input method (TELEX)</translation>
@@ -988,6 +993,7 @@
 <translation id="2421956571193030337">Only use this feature with accounts that you trust.</translation>
 <translation id="2422426094670600218">&lt;unnamed&gt;</translation>
 <translation id="2423578206845792524">Sa&amp;ve image as...</translation>
+<translation id="2424091190911472304">Always Run on <ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">Add a query param in URL to auto-refresh the page: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Appearance</translation>
 <translation id="2433728760128592593">Press Alt+Shift to switch between input methods.</translation>
@@ -1306,6 +1312,7 @@
 <translation id="2841837950101800123">Provider</translation>
 <translation id="2843055980807544929">If disabled, Chrome will handle WM_KEY* and WM_CHAR separately.</translation>
 <translation id="2843806747483486897">Change default...</translation>
+<translation id="2844111009524261443">Run on click</translation>
 <translation id="2845382757467349449">Always Show Bookmarks Bar</translation>
 <translation id="2846816712032308263">Enables fast tab/window closing - runs a tab's onunload js handler independently of the GUI.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1380,6 +1387,7 @@
 <translation id="2937174152333875430">Enable App Launcher sync</translation>
 <translation id="2938225289965773019">Open <ph name="PROTOCOL" /> links</translation>
 <translation id="2938685643439809023">Mongolian</translation>
+<translation id="2941479658084239256">Enable storing pages locally for offline use.</translation>
 <translation id="2942290791863759244">German NEO 2 keyboard</translation>
 <translation id="2943400156390503548">Slides</translation>
 <translation id="2946119680249604491">Add connection</translation>
@@ -1401,6 +1409,7 @@
 <translation id="2966598748518102999">Improve voice search by sending the sound of "Ok Google", and a few seconds before, to Google.</translation>
 <translation id="2967544384642772068">Kill</translation>
 <translation id="2968792643335932010">Less copies</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">bright down</translation>
 <translation id="2972557485845626008">Firmware</translation>
 <translation id="2972581237482394796">&amp;Redo</translation>
@@ -1463,6 +1472,7 @@
 <translation id="3064388234319122767">Transliteration (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Tab killed feedback.</translation>
 <translation id="3065140616557457172">Type to search or enter a URL to navigate - everything just works.</translation>
+<translation id="3065351588762546748">The connection to this site is using a strong protocol version and cipher suite.</translation>
 <translation id="3067198360141518313">Run this plug-in</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> has been created as a supervised user!</translation>
 <translation id="3075874217500066906">A restart is required to begin the Powerwash process. After restart you will be asked to confirm that you want to proceed.</translation>
@@ -1642,6 +1652,7 @@
 <translation id="3308006649705061278">Organisational Unit (OU)</translation>
 <translation id="3308116878371095290">This page was prevented from setting cookies.</translation>
 <translation id="3308134619352333507">Hide Button</translation>
+<translation id="3309747692199697901">Always Run on All Sites</translation>
 <translation id="3313590242757056087">To set which websites the supervised user can view, you can configure restrictions
     and settings by visiting <ph name="MANAGEMENT_URL" />.
     If you do not change the default settings, <ph name="USER_DISPLAY_NAME" />
@@ -1720,6 +1731,7 @@
 <translation id="3423858849633684918">Please Relaunch <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Specify the number of raster threads.</translation>
 <translation id="3428010780253032925">Disable rect-based targeting in views</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{at least 1 item on synced devices}=1{1 item (and more on synced devices)}other{# items (and more on synced devices)}}</translation>
 <translation id="3429599832623003132">$1 items</translation>
 <translation id="3433621910545056227">Oops!  The system failed to establish the device installation-time attributes lock.</translation>
 <translation id="343467364461911375">Some content services use machine identifiers to uniquely identify you for the purposes of authorising access to protected content.</translation>
@@ -2000,6 +2012,7 @@
 <translation id="3759933321830434300">Block parts of web pages</translation>
 <translation id="3760460896538743390">Inspect &amp;Background Page</translation>
 <translation id="37613671848467444">Open in &amp;Incognito Window</translation>
+<translation id="3763401818161139108">Always run on <ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Communicate with a USB device}other{Communicate with # USB devices}}</translation>
 <translation id="3764800135428056022">Offer to save your web passwords.</translation>
 <translation id="3764986667044728669">Unable to enroll</translation>
@@ -2224,6 +2237,7 @@
 <translation id="409579654357498729">Add to Cloud Print</translation>
 <translation id="4096508467498758490">Disable developer mode extensions</translation>
 <translation id="4098354747657067197">Deceptive site ahead</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{none}=1{1}other{#}}</translation>
 <translation id="409980434320521454">Sync failed</translation>
 <translation id="4103763322291513355">Visit &lt;strong&gt;chrome://policy&lt;/strong&gt; to see the list of blacklisted URLs and other policies enforced by your system administrator.</translation>
 <translation id="4104163789986725820">E&amp;xport...</translation>
@@ -2437,6 +2451,7 @@
 <translation id="4439318412377770121">Do you wish to register <ph name="DEVICE_NAME" /> to Google Cloud Devices?</translation>
 <translation id="4441124369922430666">Do you want to automatically start this app when the machine turns on?</translation>
 <translation id="444134486829715816">Expand...</translation>
+<translation id="4442309605992420742">Enable Weave Pairing</translation>
 <translation id="444267095790823769">Protected content exceptions</translation>
 <translation id="4443536555189480885">&amp;Help</translation>
 <translation id="4444304522807523469">Access document scanners attached via USB or on the local network</translation>
@@ -2498,6 +2513,7 @@
 <translation id="4545759655004063573">Cannot save due to insufficient permissions. Please save to another location.</translation>
 <translation id="4547659257713117923">No Tabs From Other Devices</translation>
 <translation id="4547992677060857254">The folder that you selected contains sensitive files. Are you sure that you want to grant "$1" permanent write access to this folder?</translation>
+<translation id="4552495056028768700">Page Access</translation>
 <translation id="4552678318981539154">Buy more storage</translation>
 <translation id="4554591392113183336">External extension is at the same or lower version compared to the existing one.</translation>
 <translation id="4554796861933393312">Material Design Ink Drop Animation Speed</translation>
@@ -2767,6 +2783,7 @@
 <translation id="4920887663447894854">The following sites have been blocked from tracking your location on this page:</translation>
 <translation id="492322146001920322">Conservative memory pressure release strategy</translation>
 <translation id="4923279099980110923">Yes, I want to help</translation>
+<translation id="4924202073934898868">Enables the use of an AppContainer on sandboxed processes to improve security.</translation>
 <translation id="4924638091161556692">Fixed</translation>
 <translation id="4925542575807923399">The administrator for this account requires this account to be the first signed-in account in a multiple sign-in session.</translation>
 <translation id="4927301649992043040">Pack extension</translation>
@@ -3282,6 +3299,7 @@
 <translation id="5662457369790254286">Configures Android phone page loading progress bar animation.</translation>
 <translation id="5663459693447872156">Automatically switch to half width</translation>
 <translation id="5669267381087807207">Activating</translation>
+<translation id="5669462439438204699">Save Credit Card</translation>
 <translation id="5671961047338275645">Manage sites</translation>
 <translation id="5673305876422468017">Enable Link Disambiguation Pop-up.</translation>
 <translation id="5676267133227121599">Access your passwords from any device at <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3476,6 +3494,7 @@
 <translation id="5941343993301164315">Please sign in to <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimise</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Disable the simplify page tick box on the print preview dialogue</translation>
 <translation id="5945992478690277605">Enable pinch virtual viewport.</translation>
 <translation id="5946591249682680882">Report ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Add private network</translation>
@@ -3577,11 +3596,14 @@
         If the problem persists, try clearing the cache.  In some cases, this
         can also be a symptom of hardware starting to fail.</translation>
 <translation id="6084983096586510630">First-party connections only</translation>
+<translation id="6086814797483779854">Run on Click</translation>
 <translation id="6086846494333236931">Installed by your administrator</translation>
+<translation id="6088898411501370207">The client and server don't support a common SSL protocol version or cipher suite. This is usually caused when the server needs RC4 support, which has been removed.</translation>
 <translation id="6089481419520884864">Distill page</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Your card is verified</translation>
 <translation id="6093888419484831006">Cancelling update...</translation>
+<translation id="6094826672794738469">Alternative Services.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Open maximised</translation>
 <translation id="6096326118418049043">X.500 Name</translation>
@@ -3728,7 +3750,6 @@
 <translation id="6333834492048057036">Focus address bar for search</translation>
 <translation id="6339034549827494595">Russian Phonetic (AATSEEL) keyboard</translation>
 <translation id="6341850831632289108">Detect your physical location</translation>
-<translation id="6342069812937806050">Just now</translation>
 <translation id="634208815998129842">Task manager</translation>
 <translation id="6344170822609224263">Access list of network connections</translation>
 <translation id="6344783595350022745">Clear Text</translation>
@@ -3778,6 +3799,7 @@
 <translation id="6417515091412812850">Unable to check whether the certificate has been revoked.</translation>
 <translation id="6418160186546245112">Reverting to the previously installed version of <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">Permanently remove access for all apps</translation>
+<translation id="6419708387665252597">Disable simplify page on print preview</translation>
 <translation id="6419902127459849040">Central European</translation>
 <translation id="6420676428473580225">Add to Desktop</translation>
 <translation id="6422329785618833949">Photo flipped</translation>
@@ -3909,6 +3931,7 @@
 <translation id="6588399906604251380">Enable spellchecking</translation>
 <translation id="6589706261477377614">Increase key brightness</translation>
 <translation id="6592267180249644460">WebRTC log captured <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">less than <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">best</translation>
 <translation id="6596092346130528198">Is This the New Tab Page that You Were Expecting?</translation>
 <translation id="6596325263575161958">Encryption options</translation>
@@ -4126,6 +4149,7 @@
 <translation id="6948736568813450284">For developers: use the sandbox service for Google Payments API calls.</translation>
 <translation id="6949306908218145636">Bookmark Open Pages...</translation>
 <translation id="695164542422037736">If this option is enabled and if the body is styled with background-attachment:fixed, the background will have its own composited layer.</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> remembers your passwords and signs you in to sites automatically on this device.</translation>
 <translation id="6954850746343724854">Enable Native Client for all web applications, even those that were not installed from the Chrome Web Store.</translation>
 <translation id="6955446738988643816">Inspect Pop-up</translation>
 <translation id="695755122858488207">Unselected radio button</translation>
@@ -4183,6 +4207,7 @@
 <translation id="7015226785571892184">The following application will be launched if you accept this request:
 
  <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Weave pairing is used by Weave App for secure communication with devices on local network.</translation>
 <translation id="7017004637493394352">Say "OK Google" again</translation>
 <translation id="7017219178341817193">Add a new page</translation>
 <translation id="7017354871202642555">Cannot set mode after window is set.</translation>
@@ -4514,6 +4539,7 @@
 <translation id="7503191893372251637">Netscape Certificate Type</translation>
 <translation id="7503821294401948377">Could not load icon '<ph name="ICON" />' for browser action.</translation>
 <translation id="750413812607578381">You should restart <ph name="PRODUCT_NAME" /> now.</translation>
+<translation id="7504483980780085481">This site supplied invalid Certificate Transparency information.</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> wants to:</translation>
 <translation id="750509436279396091">Open downloads folder</translation>
 <translation id="7505167922889582512">Show hidden files</translation>
@@ -4669,6 +4695,7 @@
 <translation id="7717536746040464035">Enable seccomp-bpf renderer sandbox</translation>
 <translation id="7719421816612904796">Training timed out</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7721392263035281016">A secure connection cannot be established because this site uses an unsupported protocol or cipher suite. This is usually caused when the server needs RC4 support, which has been removed.</translation>
 <translation id="7724603315864178912">Cut</translation>
 <translation id="7730449930968088409">Capture content of your screen</translation>
 <translation id="7730494089396812859">Show Cloud backup details</translation>
@@ -4769,6 +4796,7 @@
 <translation id="7864539943188674973">Disable Bluetooth</translation>
 <translation id="7870790288828963061">No Kiosk apps with newer version found. Nothing to update. Please remove the USB stick.</translation>
 <translation id="787150342916295244">Credit card scanning</translation>
+<translation id="7874357055309047713">Always run on all sites</translation>
 <translation id="7876243839304621966">Remove all</translation>
 <translation id="7877451762676714207">Unknown server error. Please try again, or contact the server administrator.</translation>
 <translation id="7878999881405658917">Google sent a notification to this phone. Note that with Bluetooth, your phone may keep your <ph name="DEVICE_TYPE" /> unlocked from over 30 feet away. In cases where this could be a problem, you can &lt;a&gt;temporarily disable this feature&lt;/a&gt;.</translation>
@@ -4808,6 +4836,7 @@
 <translation id="7918257978052780342">Enrol</translation>
 <translation id="7920092496846849526">You asked your parent if it's OK to visit this page.</translation>
 <translation id="7925285046818567682">Waiting for <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> remembers your passwords and signs you in to apps and sites automatically across devices.</translation>
 <translation id="7925686952655276919">Do not use mobile data for sync</translation>
 <translation id="7926906273904422255">Mark non-secure origins as non-secure or "dubious".</translation>
 <translation id="7928710562641958568">Eject device</translation>
@@ -4996,6 +5025,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">page</translation>
 <translation id="8180786512391440389">"<ph name="EXTENSION" />" can read and delete images, video and sound files in the ticked locations.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{none}=1{1 item}other{# items}}</translation>
 <translation id="8184538546369750125">Use global default (Allow)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - Owner</translation>
 <translation id="8185331656081929126">Show notifications when new printers are detected on the network</translation>
@@ -5061,6 +5091,7 @@
 <translation id="8263231521757761563">Active protocol handlers</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> has disabled your mouse cursor.</translation>
 <translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" triggered full screen.</translation>
+<translation id="8267698848189296333">Signing in as <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Manage your extensions by clicking Extensions in the "More tools" menu.</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> is now full screen and wants to disable your mouse cursor.</translation>
 <translation id="8275038454117074363">Import</translation>
@@ -5175,6 +5206,8 @@
 <translation id="8435334418765210033">Remembered networks</translation>
 <translation id="8437209419043462667">US</translation>
 <translation id="843730695811085446">Enables the web app style frame for hosted apps, including bookmark apps. This is currently only available for Ash.</translation>
+<translation id="8437331208797669910">Page access</translation>
+<translation id="843760761634048214">Save credit card</translation>
 <translation id="8438601631816548197">About Voice Search</translation>
 <translation id="8439506636278576865">Offer to translate pages in this language</translation>
 <translation id="8442065444327205563">Your document is ready to view.</translation>
@@ -5596,6 +5629,7 @@
 <translation id="9039890312082871605">Mute Tabs</translation>
 <translation id="9040185888511745258">Attackers on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might attempt to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites that you visit).</translation>
 <translation id="9040421302519041149">Access to this network is protected.</translation>
+<translation id="9040967476106479091">Choose your account from <ph name="PASSWORD_MANAGER_BRAND" /> to sign in</translation>
 <translation id="9041603713188951722">Show settings in a window</translation>
 <translation id="904451693890288097">Please enter the passkey for "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">The web page at <ph name="URL" /> no longer exists.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 01f56ce..034d8975 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -3714,7 +3714,6 @@
 <translation id="6333834492048057036">El cursor se sitúa en la barra de direcciones para la búsqueda.</translation>
 <translation id="6339034549827494595">Teclado fonético de ruso (AATSEEL)</translation>
 <translation id="6341850831632289108">Detectar tu ubicación física</translation>
-<translation id="6342069812937806050">Recién</translation>
 <translation id="634208815998129842">Administrador de tareas</translation>
 <translation id="6344170822609224263">Acceder a la lista de conexiones de red</translation>
 <translation id="6344783595350022745">Borrar texto</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 1347826e..882b97d 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -3715,7 +3715,6 @@
 <translation id="6333834492048057036">El cursor se sitúa en la barra de direcciones para la búsqueda</translation>
 <translation id="6339034549827494595">Teclado fonético ruso (AATSEEL)</translation>
 <translation id="6341850831632289108">Detectar tu ubicación física</translation>
-<translation id="6342069812937806050">Ahora</translation>
 <translation id="634208815998129842">Administrador de tareas</translation>
 <translation id="6344170822609224263">Accede a la lista de conexiones de red</translation>
 <translation id="6344783595350022745">Borrar texto</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index be23ffd2..eb9bc182 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3728,7 +3728,6 @@
 <translation id="6333834492048057036">Aadressiriba esiletõstmine otsinguks</translation>
 <translation id="6339034549827494595">Vene foneetiline (AATSEEL) klaviatuur</translation>
 <translation id="6341850831632289108">Teie füüsilise asukoha tuvastamine</translation>
-<translation id="6342069812937806050">Äsja</translation>
 <translation id="634208815998129842">Tegumihaldur</translation>
 <translation id="6344170822609224263">Juurdepääs võrguühenduste loendile</translation>
 <translation id="6344783595350022745">Lihttekst</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 1344d0f5..c30cc16 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1380,7 +1380,7 @@
 <translation id="2946119680249604491">افزودن اتصال</translation>
 <translation id="2946640296642327832">فعال کردن بلوتوث</translation>
 <translation id="2948083400971632585">در صفحه تنظیمات می‌توانید همه پراکسی‌های پیکربندی شده برای هر اتصال را از کار بیاندازید.</translation>
-<translation id="2948300991547862301">برو به <ph name="PAGE_TITLE" /></translation>
+<translation id="2948300991547862301">رفتن به <ph name="PAGE_TITLE" /></translation>
 <translation id="29488703364906173">مرورگر وب سریع، ساده و ایمن که برای وب مدرن طراحی شده است.</translation>
 <translation id="2950186680359523359">سرور بدون ارسال هرگونه داده، اتصال را قطع کرد.</translation>
 <translation id="2951247061394563839">پنجره مرکزی</translation>
@@ -3712,7 +3712,6 @@
 <translation id="6333834492048057036">تمرکز نوار آدرس برای جستجو</translation>
 <translation id="6339034549827494595">‏صفحه‌کلید آوایی روسی (AATSEEL)</translation>
 <translation id="6341850831632289108">شناسایی موقعیت مکانی فیزیکی شما</translation>
-<translation id="6342069812937806050">فقط اکنون</translation>
 <translation id="634208815998129842">مدیر فعالیت‌ها</translation>
 <translation id="6344170822609224263">فهرست دسترسی از اتصالات شبکه</translation>
 <translation id="6344783595350022745">پاک‌کردن نوشتار</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 8b3f861..37265299 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3692,7 +3692,6 @@
 <translation id="6333834492048057036">Tarkenna osoitepalkkiin hakua varten</translation>
 <translation id="6339034549827494595">Näppäimistö: venäjä (foneettinen AATSEEL)</translation>
 <translation id="6341850831632289108">Tunnistaa sijaintisi</translation>
-<translation id="6342069812937806050">Valmistui juuri</translation>
 <translation id="634208815998129842">Tehtävänhallinta</translation>
 <translation id="6344170822609224263">Pääsy verkkoyhteysluetteloon</translation>
 <translation id="6344783595350022745">Tyhjennä teksti</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 5d33f4b..0045d40 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Mag-Set up ng Mga Awtomatikong Update para sa Lahat ng Mga User</translation>
 <translation id="1079766198702302550">Palaging i-block ang access sa camera</translation>
+<translation id="1082398631555931481">Gustong ibalik ng <ph name="THIRD_PARTY_TOOL_NAME" /> ang mga setting ng iyong Chrome sa mga orihinal na default ng mga ito. Kapag isinagawa mo ito, mare-reset ang iyong home page, page ng bagong tab at search engine, madi-disable ang iyong mga extension at maa-unpin ang lahat ng tab. Maki-clear din nito ang iba pang pansamantala at naka-cache na data, gaya ng cookies, content at data ng site.</translation>
 <translation id="108346963417674655">Hindi makakonekta nang ligtas sa server. Maaaring noong nakaraan ay gumagana ang website na ito, ngunit may problema sa server. Kapag kumonekta sa naturang mga site, humihina ang seguridad para sa lahat ng user at kaya naman na-disable ito.</translation>
 <translation id="1084538181352409184">Suriin ang iyong mga setting ng proxy o makipag-ugnay sa administrator ng iyong network upang
           matiyak na gumagana ang proxy server.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">Catalan</translation>
 <translation id="1156185823432343624">Volume: Naka-mute</translation>
 <translation id="1156689104822061371">Layout ng keyboard:</translation>
+<translation id="1158274711289833876">Secure na TLS na koneksyon</translation>
 <translation id="1160536908808547677">Kapag naka-zoom in, kumakabit sa viewport na ito ang mga element na hindi nababago ang posisyon at mga scaled na scrollbar.</translation>
 <translation id="1161575384898972166">Mangyaring mag-sign in sa <ph name="TOKEN_NAME" /> upang i-export ang certificate ng client.</translation>
 <translation id="1162223735669141505">Kailangang naka-enable ang <ph name="BEGIN_LINK" />plugin ng Native Client<ph name="END_LINK" /> upang magamit ang feature na ito.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">Paganahin ang mga tampok ng accessibility upang maging mas madaling gamitin ang iyong device.</translation>
 <translation id="1190144681599273207">Ang pagkuha sa file na ito ay gagamit ng humigit-kumulang <ph name="FILE_SIZE" /> (na) mobile data.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Mag-access ng file na nakaimbak sa iyong computer}one{Mag-access ng # file na nakaimbak sa iyong computer}other{Mag-access ng # na file na nakaimbak sa iyong computer}}</translation>
+<translation id="1190855992966397019">I-enable ang AppContainer Lockdown.</translation>
 <translation id="1195447618553298278">Hindi kilalang error.</translation>
 <translation id="1196338895211115272">Nabigong i-export ang pribadong key.</translation>
 <translation id="1196789802623400962">I-enable/i-disable ang opsyon para sa pag-e-edit ng galaw sa mga page ng setting para sa virtual na keyboard.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">Mga Service Worker</translation>
 <translation id="123578888592755962">Puno na ang disk</translation>
 <translation id="1240892293903523606">DOM Inspector</translation>
+<translation id="1242633766021457174">Gustong i-reset ng <ph name="THIRD_PARTY_TOOL_NAME" /> ang iyong mga setting.</translation>
 <translation id="1243314992276662751">I-upload</translation>
 <translation id="1244303850296295656">Error sa extension</translation>
 <translation id="1248269069727746712">Ginagamit ng <ph name="PRODUCT_NAME" /> ang mga setting sa system proxy ng iyong device upang makakonekta sa network.</translation>
@@ -233,6 +237,7 @@
 <translation id="1338950911836659113">Nagtatanggal...</translation>
 <translation id="1339266338863469628">Default (ikaw lang ang pakinggan)</translation>
 <translation id="1340527397989195812">Mag-back up ng media mula sa device gamit ang Files app.</translation>
+<translation id="1341988552785875222">Itinakda ng '<ph name="APP_NAME" />' ang wallpaper sa kasalukuyan. Maaaring kailanganin mong i-uninstall ang '<ph name="APP_NAME" />' bago ka pumili ng ibang wallpaper.</translation>
 <translation id="1343517687228689568">I-unpin ang pahinang ito mula sa screen ng Simula...</translation>
 <translation id="1344519653668879001">Huwag paganahin ang pag-audit ng hyperlink</translation>
 <translation id="1346104802985271895">Paraan ng pag-input na Vietnamese (TELEX)</translation>
@@ -989,6 +994,7 @@
 <translation id="2421956571193030337">Gamitin lang ang feature na ito sa mga account na pinagkakatiwalaan mo.</translation>
 <translation id="2422426094670600218">&lt;unnamed&gt;</translation>
 <translation id="2423578206845792524">I-sa&amp;ve ang larawan bilang...</translation>
+<translation id="2424091190911472304">Patakbuhin sa <ph name="ORIGIN" /> sa Lahat ng Pagkakataon</translation>
 <translation id="2433452467737464329">Magdagdag ng query param sa URL upang i-auto-refresh ang pahina: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Hitsura</translation>
 <translation id="2433728760128592593">Pindutin ang Alt+Shift upang magpalipat-lipat sa mga pamamaraan ng pag-input.</translation>
@@ -1308,6 +1314,7 @@
 <translation id="2841837950101800123">Provider</translation>
 <translation id="2843055980807544929">Kung naka-disable, pangangasiwaan ng Chrome ang WM_KEY* at WM_CHAR nang hiwalay.</translation>
 <translation id="2843806747483486897">Baguhin ang default...</translation>
+<translation id="2844111009524261443">Patakbuhin kapag na-click</translation>
 <translation id="2845382757467349449">Palaging Ipakita ang Bookmarks Bar</translation>
 <translation id="2846816712032308263">Ini-enable ang mabilis na pagsasara ng tab/window - pinapatakbo ang onunload js handler ng isang tab nang independiyente sa GUI.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1382,6 +1389,7 @@
 <translation id="2937174152333875430">I-enable ang Pag-sync sa App Launcher</translation>
 <translation id="2938225289965773019">Buksan ang mga link ng <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">Mongolian</translation>
+<translation id="2941479658084239256">Ine-enable ang lokal na pag-iimbak ng mga page para sa offline na paggamit.</translation>
 <translation id="2942290791863759244">German NEO 2 keyboard</translation>
 <translation id="2943400156390503548">Slides</translation>
 <translation id="2946119680249604491">Magdagdag ng koneksyon</translation>
@@ -1403,6 +1411,7 @@
 <translation id="2966598748518102999">Pahusayin ang paghahanap gamit ang boses sa pamamagitan ng pagpapadala ng tunog ng "Ok Google," at ng ilang segundo bago iyon, sa Google.</translation>
 <translation id="2967544384642772068">Isara</translation>
 <translation id="2968792643335932010">Bawasan ang mga kopya</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">babaan ang brightness</translation>
 <translation id="2972557485845626008">Firmware</translation>
 <translation id="2972581237482394796">&amp;I-redo</translation>
@@ -1465,6 +1474,7 @@
 <translation id="3064388234319122767">Transliteration (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Feedback na isinara ang tab</translation>
 <translation id="3065140616557457172">I-type upang mahanap o ilagay ang isang URL para i-navigate - gumagana naman ang lahat.</translation>
+<translation id="3065351588762546748">Gumagamit ang koneksyon sa site na ito ng isang matatag na bersyon ng protocol at cipher suite.</translation>
 <translation id="3067198360141518313">Patakbuhin ang plugin na ito</translation>
 <translation id="3075239840551149663">Nagawa na si <ph name="NEW_PROFILE_NAME" /> bilang isang pinangangasiwaang user!</translation>
 <translation id="3075874217500066906">Kailangang mag-restart upang masimulan ang proseso ng Powerwash. Pagkatapos mag-restart, hihilingin sa iyo na kumpirmahing gusto mong magpatuloy.</translation>
@@ -1644,6 +1654,7 @@
 <translation id="3308006649705061278">Organizational Unit (OU)</translation>
 <translation id="3308116878371095290">Naharangan ang pahinang ito mula sa pagtatakda ng cookies.</translation>
 <translation id="3308134619352333507">Itago ang Button</translation>
+<translation id="3309747692199697901">Patakbuhin sa Lahat ng Site sa Lahat ng Pagkakataon</translation>
 <translation id="3313590242757056087">Upang itakda kung aling mga website ang maaring tingnan ng pinangangasiwaang user, maisasaayos mo ang mga paghihigpit
     at setting sa pamamagitan ng pagbisita sa <ph name="MANAGEMENT_URL" />.
     Kung hindi mo babaguhin ang mga default na setting, maba-browse ni <ph name="USER_DISPLAY_NAME" />
@@ -1723,6 +1734,7 @@
 <translation id="3423858849633684918">Pakilunsad Muli ang <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Tukuyin ang bilang ng mga raster thread.</translation>
 <translation id="3428010780253032925">I-disable ang rect-based na pagta-target sa mga view</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{kahit 1 item sa mga naka-sync na device}=1{1 item (at higit pa sa mga naka-sync na device)}one{# item (at higit pa sa mga naka-sync na device)}other{# na item (at higit pa sa mga naka-sync na device)}}</translation>
 <translation id="3429599832623003132">Mga $1 na item</translation>
 <translation id="3433621910545056227">Naku! Nabigo ang system na itatag ang lock sa mga katangian sa oras ng pag-install.</translation>
 <translation id="343467364461911375">Ang ilang serbisyo sa content ay gumagamit ng mga identifier ng machine upang makilala ka sa natatanging paraan para sa mga layuning pagpapahintulot sa access sa pinoprotektahang content.</translation>
@@ -2004,6 +2016,7 @@
 <translation id="3759933321830434300">Mag-block ng mga bahagi ng mga web page</translation>
 <translation id="3760460896538743390">Siyasatin ang Pahina ng &amp;Background</translation>
 <translation id="37613671848467444">Buksan sa &amp;Incognito Window</translation>
+<translation id="3763401818161139108">Patakbuhin sa <ph name="ORIGIN" /> sa lahat ng pagkakataon</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kumonekta sa isang USB device}one{Kumonekta sa # USB device}other{Kumonekta sa # na USB device}}</translation>
 <translation id="3764800135428056022">Mag-alok na i-save ang iyong mga password sa web.</translation>
 <translation id="3764986667044728669">Hindi ma-enroll</translation>
@@ -2228,6 +2241,7 @@
 <translation id="409579654357498729">Idagdag sa Cloud Print</translation>
 <translation id="4096508467498758490">I-disable ang mga extension ng developer mode</translation>
 <translation id="4098354747657067197">May malapit na nakakapanlinlang na site</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{wala}=1{1}one{#}other{#}}</translation>
 <translation id="409980434320521454">Nabigo ang pag-sync</translation>
 <translation id="4103763322291513355">Bisitahin ang &lt;strong&gt;chrome://policy&lt;/strong&gt; upang makita ang listahan ng mga naka-blacklist na URL at iba pang mga patakaran na ipinapatupad ng iyong system administrator.</translation>
 <translation id="4104163789986725820">I-e&amp;xport...</translation>
@@ -2441,6 +2455,7 @@
 <translation id="4439318412377770121">Gusto mo bang iparehistro ang <ph name="DEVICE_NAME" /> sa mga Google Cloud Device?</translation>
 <translation id="4441124369922430666">Nais mo bang awtomatikong simulan ang app na ito kapag nag-on ang makina?</translation>
 <translation id="444134486829715816">Palawakin...</translation>
+<translation id="4442309605992420742">I-enable ang pagpapares ng Weave</translation>
 <translation id="444267095790823769">Mga pagbubukod sa pinoprotektahang nilalaman</translation>
 <translation id="4443536555189480885">&amp;Tulong</translation>
 <translation id="4444304522807523469">I-access ang mga scanner ng dokumento na naka-attach sa pamamagitan ng USB o sa lokal na network</translation>
@@ -2502,6 +2517,7 @@
 <translation id="4545759655004063573">Hindi ma-save dahil hindi sapat ang mga pahintulot. Mangyaring i-save sa isa pang lokasyon.</translation>
 <translation id="4547659257713117923">Walang Mga Tab Mula Sa Ibang Mga Device</translation>
 <translation id="4547992677060857254">Naglalaman ng mga sensitibong file ang folder na iyong pinili. Sigurado ka bang gusto mong magbigay ng "PhP50" na permanenteng write access sa folder na ito?</translation>
+<translation id="4552495056028768700">Access sa Page</translation>
 <translation id="4552678318981539154">Bumili ng higit pang storage</translation>
 <translation id="4554591392113183336">Pareho o mas mababa ang bersyon ng external na extension kumpara sa umiiral nang extension.</translation>
 <translation id="4554796861933393312">Bilis ng Animation ng Ink Drop ng Disenyo ng Materyal</translation>
@@ -2771,6 +2787,7 @@
 <translation id="4920887663447894854">Hinarangan ang sumusunod na mga site mula sa pagsubaybay ng iyong lokasyon sa pahinang ito:</translation>
 <translation id="492322146001920322">Konserbatibong diskarte sa pag-release sa memory pressure</translation>
 <translation id="4923279099980110923">Oo, gusto kong makatulong</translation>
+<translation id="4924202073934898868">Ine-enable ang paggamit ng isang AppContainer sa mga naka-sandbox na proseso upang mahigpitan ang seguridad.</translation>
 <translation id="4924638091161556692">Naayos</translation>
 <translation id="4925542575807923399">Kinakailangan ng administrator sa account na ito na ang account na ito ang unang i-sign in na account sa isang session ng multiple na pag-sign in.</translation>
 <translation id="4927301649992043040">Pack Extension</translation>
@@ -3286,6 +3303,7 @@
 <translation id="5662457369790254286">Nagko-configure ng animation ng bar ng pag-usad para sa paglo-load ng page sa isang Android phone.</translation>
 <translation id="5663459693447872156">Awtomatikong lumipat sa kalahating lapad</translation>
 <translation id="5669267381087807207">Ina-activate</translation>
+<translation id="5669462439438204699">I-save ang Credit Card</translation>
 <translation id="5671961047338275645">Pamahalaan ang mga site</translation>
 <translation id="5673305876422468017">I-enable ang Link Disambiguation Popup.</translation>
 <translation id="5676267133227121599">I-access ang iyong mga password mula sa anumang device sa <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3480,6 +3498,7 @@
 <translation id="5941343993301164315">Mangyaring mag-sign in sa <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimize</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Dini-disable ang check box na pasimplehin ang page sa dialog na preview ng pag-print</translation>
 <translation id="5945992478690277605">I-enable ang pinch virtual viewport.</translation>
 <translation id="5946591249682680882">Report ID <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Magdagdag ng pribadong network</translation>
@@ -3580,11 +3599,14 @@
         Kapag nagpatuloy ang problema, subukang i-clear ang cache.  Sa ilang sitwasyon, maaaring
         maging sintomas din ito ng simula ng pagkasira ng hardware.</translation>
 <translation id="6084983096586510630">Mga koneksyon na first-party lang</translation>
+<translation id="6086814797483779854">Patakbuhin kapag Na-click</translation>
 <translation id="6086846494333236931">Na-install ng iyong administrator</translation>
+<translation id="6088898411501370207">Hindi sumusuporta ng pangkaraniwang bersyon o cipher suite ng SSL protocol ang client at server. Karaniwan itong nangyayari kapag kailangan ng server ng suporta sa RC4 na naalis na.</translation>
 <translation id="6089481419520884864">Distill page</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Na-verify ang iyong card</translation>
 <translation id="6093888419484831006">Kinakansela ang pag-update...</translation>
+<translation id="6094826672794738469">Mga Alternatibong Serbisyo.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Buksan ang naka-maximize</translation>
 <translation id="6096326118418049043">Pangalan na X.500</translation>
@@ -3731,7 +3753,6 @@
 <translation id="6333834492048057036">I-focus ang address bar para sa paghahanap</translation>
 <translation id="6339034549827494595">Russian Phonetic (AATSEEL) keyboard</translation>
 <translation id="6341850831632289108">Tukuyin ang iyong aktwal na lokasyon</translation>
-<translation id="6342069812937806050">Ngayon lang</translation>
 <translation id="634208815998129842">Task manager</translation>
 <translation id="6344170822609224263">I-access ang listahan ng mga koneksyon sa network</translation>
 <translation id="6344783595350022745">I-clear ang Teksto</translation>
@@ -3781,6 +3802,7 @@
 <translation id="6417515091412812850">Hindi nagawang masuri kung nabawi na ang certificate.</translation>
 <translation id="6418160186546245112">Nire-revert sa dating naka-install na bersyon ng <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">Permanenteng alisin ang access para sa lahat ng apps</translation>
+<translation id="6419708387665252597">I-disable ang pasimplehin ang page sa preview ng pag-print</translation>
 <translation id="6419902127459849040">Central European</translation>
 <translation id="6420676428473580225">Idagdag sa Desktop</translation>
 <translation id="6422329785618833949">Na-flip ang larawan</translation>
@@ -3911,6 +3933,7 @@
 <translation id="6588399906604251380">Paganahin ang pag-check ng spelling</translation>
 <translation id="6589706261477377614">Dagdagan ang brightness ng key</translation>
 <translation id="6592267180249644460">Na-capture ang log ng WebRTC noong <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">wala pang <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">pinakamahusay</translation>
 <translation id="6596092346130528198">Ito Ba Ang Page ng Bagong Tab na Inaasahan Mo?</translation>
 <translation id="6596325263575161958">Mga pagpipilian sa pag-encrypt</translation>
@@ -4132,6 +4155,7 @@
 <translation id="6948736568813450284">Para sa mga developer: gamitin ang serbisyo ng sandbox para sa mga pag-call ng Google Payments API.</translation>
 <translation id="6949306908218145636">I-bookmark ang Mga Nakabukas na Pahina...</translation>
 <translation id="695164542422037736">Kung naka-enable ang pagpipiliang ito, at kung naka-istilo ang nilalaman gamit ang background-attachment:fixed, magkakaroon ang background ng sariling na-composite na layer.</translation>
+<translation id="6952626679169241027">Tinatandaan ng <ph name="PASSWORD_MANAGER_BRAND" /> ang iyong mga password at awtomatiko kang sina-sign in sa mga site sa device na ito.</translation>
 <translation id="6954850746343724854">Paganahin ang Native Client para sa lahat ng web application, maging para sa mga hindi na-install mula sa Chrome Web Store.</translation>
 <translation id="6955446738988643816">Siyasatin ang Popup</translation>
 <translation id="695755122858488207">Di-piniling radio button</translation>
@@ -4189,6 +4213,7 @@
 <translation id="7015226785571892184">Ilulunsad ang sumusunod na application kung tinanggap mo ang kahilingang ito:
 
  <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Ginagamit ng Weave App ang pagpapares ng Weave upang magkaroon ng ligtas na pakikipag-ugnayan sa mga device sa lokal na network.</translation>
 <translation id="7017004637493394352">Sabihing muli ang "Ok Google"</translation>
 <translation id="7017219178341817193">Magdagdag ng bagong page </translation>
 <translation id="7017354871202642555">Hindi matakda ang mode pagkatapos matakda ang window.</translation>
@@ -4525,6 +4550,7 @@
 <translation id="7503191893372251637">Uri ng Netscape Certificate</translation>
 <translation id="7503821294401948377">Maaaring hindi mai-load ang icon na '<ph name="ICON" />' para sa pagkilos ng browser.</translation>
 <translation id="750413812607578381">Dapat mong i-restart ang <ph name="PRODUCT_NAME" /> ngayon.</translation>
+<translation id="7504483980780085481">Nagbigay ang site na ito ng hindi wastong impormasyon tungkol sa Certificate Transparency.</translation>
 <translation id="7504676042960447229">Gusto ng <ph name="SITE_NAME" /> na:</translation>
 <translation id="750509436279396091">Buksan ang folder ng mga download</translation>
 <translation id="7505167922889582512">Magpakita ng mga natatagong file</translation>
@@ -4678,6 +4704,7 @@
 <translation id="7717536746040464035">I-enable ang sandbox ng renderer ng seccomp-bpf</translation>
 <translation id="7719421816612904796">Nag-time out ang pagsasanay</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7721392263035281016">Hindi makabuo ng ligtas na koneksyon dahil gumagamit ang site na ito ng isang hindi sinusuportahang protocol or cipher suite. Karaniwan itong nangyayari kapag kailangan ng server ng suporta sa RC4 na naalis na.</translation>
 <translation id="7724603315864178912">I-cut</translation>
 <translation id="7730449930968088409">Kunan ang nilalaman ng iyong screen</translation>
 <translation id="7730494089396812859">Ipakita ang mga detalye ng pag-back up sa Cloud</translation>
@@ -4778,6 +4805,7 @@
 <translation id="7864539943188674973">Huwag Paganahin ang Bluetooth</translation>
 <translation id="7870790288828963061">Walang nahanap na mga Kiosk app na may mas bagong bersyon. Walang ia-update. Mangyaring alisin ang USB stick.</translation>
 <translation id="787150342916295244">Pagsa-scan ng credit card</translation>
+<translation id="7874357055309047713">Patakbuhin sa lahat ng site sa lahat ng pagkakataon</translation>
 <translation id="7876243839304621966">Alisin lahat</translation>
 <translation id="7877451762676714207">Hindi alam na error sa server. Pakisubukang muli, o makipag-ugnay sa administrator ng server.</translation>
 <translation id="7878999881405658917">Nagpadala ang Google ng notification sa teleponong ito. Tandaan na gamit ang Bluetooth, maaaring panatilihin ng iyong telepono na naka-unlock ang iyong <ph name="DEVICE_TYPE" /> mula sa layong mahigit 30 talampakan. Sa mga sitwasyon kung saan maaari itong maging problema, maaari mong &lt;a&gt;pansamantalang i-disable ang feature na ito&lt;/a&gt;.</translation>
@@ -4817,6 +4845,7 @@
 <translation id="7918257978052780342">Magpatala</translation>
 <translation id="7920092496846849526">Tinanong mo ang iyong magulang kung maaari mong bisitahin ang page na ito.</translation>
 <translation id="7925285046818567682">Naghihintay para sa <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824">Tinatandaan ng <ph name="PASSWORD_MANAGER_BRAND" /> ang iyong mga password at awtomatiko kang sina-sign in sa mga app at site sa lahat ng device.</translation>
 <translation id="7925686952655276919">Huwag gumamit ng data sa mobile para sa pag-sync</translation>
 <translation id="7926906273904422255">Markahan ang mga hindi secure na pinagmulan bilang hindi secure o bilang "kahina-hinala."</translation>
 <translation id="7928710562641958568">I-eject ang device</translation>
@@ -5004,6 +5033,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">pahina</translation>
 <translation id="8180786512391440389">Magagawa ng "<ph name="EXTENSION" />" na magbasa at magtanggal ng mga larawan, video, at sound file sa mga may check na lokasyon.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{wala}=1{1 item}one{# item}other{# na item}}</translation>
 <translation id="8184538546369750125">Gamitin ang pangkalahatang default (Payagan)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - May-ari</translation>
 <translation id="8185331656081929126">Magpakita ng mga notification kapag may nakitang mga bagong printer sa network</translation>
@@ -5069,6 +5099,7 @@
 <translation id="8263231521757761563">Mga tagapangasiwa ng aktibong protocol</translation>
 <translation id="8263744495942430914">Hindi pinagana ng <ph name="FULLSCREEN_ORIGIN" /> ang cursor ng iyong mouse.</translation>
 <translation id="8264718194193514834">Nag-trigger ang "<ph name="EXTENSION_NAME" />" ng full screen.</translation>
+<translation id="8267698848189296333">Nagsa-sign in bilang <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Pamahalaan ang iyong mga extension sa pamamagitan ng pag-click sa Mga Extension sa menu ng "Higit pang mga tool."</translation>
 <translation id="8273972836055206582">Nasa full screen na ngayon ang <ph name="FULLSCREEN_ORIGIN" /> at gustong hindi paganahin ang cursor ng iyong mouse.</translation>
 <translation id="8275038454117074363">I-import</translation>
@@ -5184,6 +5215,8 @@
 <translation id="8435334418765210033">Mga naalalang network</translation>
 <translation id="8437209419043462667">US</translation>
 <translation id="843730695811085446">Ine-enable ang frame na may istilong pang-web app para sa mga naka-host na app, kasama na ang mga bookmark app. Sa kasalukuyan, available lang ito para sa Ash.</translation>
+<translation id="8437331208797669910">Access sa page</translation>
+<translation id="843760761634048214">I-save ang credit card</translation>
 <translation id="8438601631816548197">Tungkol sa Paghahanap Gamit ang Boses</translation>
 <translation id="8439506636278576865">Mag-alok na magsalin ng mga page sa wikang ito
 </translation>
@@ -5607,6 +5640,7 @@
 <translation id="9039890312082871605">Mag-mute ng Mga Tab</translation>
 <translation id="9040185888511745258">Maaaring subukan ng mga attacker sa <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> na linlangin ka upang mag-install ng mga program na nakakasira sa iyong karanasan sa pagba-browse (halimbawa, sa pamamagitan ng pagbabago ng iyong homepage o pagpapakita ng mga karagdagang ad sa mga site na iyong binibisita).</translation>
 <translation id="9040421302519041149">Protektado ang access sa network na ito.</translation>
+<translation id="9040967476106479091">Upang makapag-sign, piliin ang iyong account sa <ph name="PASSWORD_MANAGER_BRAND" /></translation>
 <translation id="9041603713188951722">Ipakita ang mga setting sa isang window</translation>
 <translation id="904451693890288097">Pakilagay ang passkey para sa "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">Hindi na umiiral ang webpage sa <ph name="URL" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 21ccbfa..3b90a0f1 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3728,7 +3728,6 @@
 <translation id="6333834492048057036">Centrer sur la barre d'adresse pour la recherche</translation>
 <translation id="6339034549827494595">Clavier russe phonétique (AATSEEL)</translation>
 <translation id="6341850831632289108">Détecter votre position géographique</translation>
-<translation id="6342069812937806050">À l'instant</translation>
 <translation id="634208815998129842">Gestionnaire de tâches</translation>
 <translation id="6344170822609224263">Accéder à la liste des connexions réseau</translation>
 <translation id="6344783595350022745">Effacer le texte</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 2b865fa..30dbb35 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3723,7 +3723,6 @@
 <translation id="6333834492048057036">શોધ માટે સરનામાં બાર પર ફોકસ કરો</translation>
 <translation id="6339034549827494595">રશિયન ધ્વન્યાત્મક (AATSEEL) કીબોર્ડ</translation>
 <translation id="6341850831632289108">તમારા ભૌતિક સ્થાનને શોધો</translation>
-<translation id="6342069812937806050">હમણાં જ</translation>
 <translation id="634208815998129842">કાર્ય સંચાલક</translation>
 <translation id="6344170822609224263">નેટવર્ક કનેક્શન્સની ઍક્સેસ સૂચિ</translation>
 <translation id="6344783595350022745">ટેક્સ્ટ સાફ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index d185cdbb..f4f99c0 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -3732,7 +3732,6 @@
 <translation id="6333834492048057036">खोज के लिए पता बार पर फ़ोकस करें</translation>
 <translation id="6339034549827494595">रूसी फ़ोनेटिक (AATSEEL) कीबोर्ड</translation>
 <translation id="6341850831632289108">अपने भौतिक स्थान का पता लगाएं</translation>
-<translation id="6342069812937806050">अभी</translation>
 <translation id="634208815998129842">कार्य प्रबंधक</translation>
 <translation id="6344170822609224263">नेटवर्क कनेक्शन की सूची एक्सेस करें</translation>
 <translation id="6344783595350022745">लेख साफ़ करें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 765a78f..af36d69d 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3711,7 +3711,6 @@
 <translation id="6333834492048057036">Fokusiraj adresnu traku za pretraživanje</translation>
 <translation id="6339034549827494595">Ruska fonetska (AATSEEL) tipkovnica</translation>
 <translation id="6341850831632289108">otkriti vašu fizičku lokaciju</translation>
-<translation id="6342069812937806050">Samo sad</translation>
 <translation id="634208815998129842">Upravitelj zadataka</translation>
 <translation id="6344170822609224263">pristupiti popisu mrežnih veza</translation>
 <translation id="6344783595350022745">Izbriši tekst</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 306a544e..ca0c44d 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -3711,7 +3711,6 @@
 <translation id="6333834492048057036">Címsávra fókuszálás a kereséshez</translation>
 <translation id="6339034549827494595">Orosz fonetikus (AATSEEL) billentyűzet</translation>
 <translation id="6341850831632289108">Az Ön tartózkodási helyének észlelése</translation>
-<translation id="6342069812937806050">Éppen most</translation>
 <translation id="634208815998129842">Feladatkezelő</translation>
 <translation id="6344170822609224263">A hálózati kapcsolatok hozzáférési listája</translation>
 <translation id="6344783595350022745">Szöveg törlése</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 85c08ee..bd38d30 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Menyiapkan Pembaruan Otomatis untuk Semua Pengguna</translation>
 <translation id="1079766198702302550">Selalu blokir akses kamera</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> ingin memulihkan setelan Chrome ke default aslinya. Tindakan ini akan menyetel ulang beranda, laman tab baru, dan mesin telusur, menonaktfikan ekstensi, dan melepas pin semua tab. Tindakan ini juga akan menghapus data sementara dan data yang tersimpan dalam cache, seperti cookie, konten, dan data situs.</translation>
 <translation id="108346963417674655">Tidak dapat tersambung dengan aman ke server. Situs web ini mungkin sebelumnya bekerja, namun terjadi masalah dengan server. Sambungan ke situs semacam ini melemahkan keamanan untuk semua pengguna dan oleh karena itu situs telah dinonaktifkan.</translation>
 <translation id="1084538181352409184">Periksa setelan proxy atau hubungi administrator jaringan untuk
           memastikan bahwa server proxy bekerja.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">Catalan</translation>
 <translation id="1156185823432343624">Volume: Disenyapkan</translation>
 <translation id="1156689104822061371">Tata letak keyboard:</translation>
+<translation id="1158274711289833876">Sambungan TLS aman</translation>
 <translation id="1160536908808547677">Saat diperbesar, elemen posisi yang tetap dan bilah gulir yang diskalakan akan melekat pada area pandang ini.</translation>
 <translation id="1161575384898972166">Masuklah ke <ph name="TOKEN_NAME" /> untuk mengeskpor sertifikat klien.</translation>
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Plugin Klien Asli<ph name="END_LINK" /> perlu diaktifkan untuk menggunakan fitur ini.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">Aktifkan fitur aksesibilitas untuk membuat perangkat Anda lebih mudah digunakan.</translation>
 <translation id="1190144681599273207">Mengambil file ini akan menggunakan sekitar <ph name="FILE_SIZE" /> data seluler.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Mengakses satu file yang tersimpan di komputer Anda}other{Mengakses # file yang tersimpan di komputer Anda}}</translation>
+<translation id="1190855992966397019">Aktifkan Gembok Total AppContainer.</translation>
 <translation id="1195447618553298278">Kesalahan tak dikenal.</translation>
 <translation id="1196338895211115272">Gagal mengekspor kunci pribadi.</translation>
 <translation id="1196789802623400962">Mengaktifkan/Menonaktifkan opsi pengeditan isyarat di laman setelan untuk keyboard virtual.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="123578888592755962">Disk penuh</translation>
 <translation id="1240892293903523606">Pemeriksa DOM</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ingin menyetel ulang setelan Anda.</translation>
 <translation id="1243314992276662751">Unggah</translation>
 <translation id="1244303850296295656">Kesalahan ekstensi</translation>
 <translation id="1248269069727746712"><ph name="PRODUCT_NAME" /> menggunakan setelan proxy sistem perangkat Anda untuk menyambung ke jaringan.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">Menghapus...</translation>
 <translation id="1339266338863469628">Default (hanya mengambil Anda)</translation>
 <translation id="1340527397989195812">Cadangkan media dari perangkat menggunakan aplikasi File.</translation>
+<translation id="1341988552785875222">Wallpaper saat ini disetel oleh '<ph name="APP_NAME" />'. Anda mungkin perlu mencopot pemasangan '<ph name="APP_NAME" />' sebelum memilih wallpaper lainnya.</translation>
 <translation id="1343517687228689568">Lepas pin laman ini dari layar Awal...</translation>
 <translation id="1344519653668879001">Nonaktifkan pengauditan hyperlink</translation>
 <translation id="1346104802985271895">Metode masukan Bahasa Vietnam (TELEX)</translation>
@@ -986,6 +991,7 @@
 <translation id="2421956571193030337">Hanya gunakan fitur ini dengan akun tepercaya.</translation>
 <translation id="2422426094670600218">&lt;tanpanama&gt;</translation>
 <translation id="2423578206845792524">Sim&amp;pan gambar sebagai...</translation>
+<translation id="2424091190911472304">Selalu Jalankan di <ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">Tambahkan parameter kueri di URL untuk menyegarkan laman secara otomatis: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Tampilan</translation>
 <translation id="2433728760128592593">Tekan Alt+Shift untuk beralih antar metode masukan.</translation>
@@ -1305,6 +1311,7 @@
 <translation id="2841837950101800123">Penyedia</translation>
 <translation id="2843055980807544929">Jika dinonaktifkan, Chrome akan menangani WM_KEY* dan WM_CHAR secara terpisah.</translation>
 <translation id="2843806747483486897">Ubah default...</translation>
+<translation id="2844111009524261443">Jalankan saat diklik</translation>
 <translation id="2845382757467349449">Selalu Tampilkan Bilah Bookmark</translation>
 <translation id="2846816712032308263">Mengaktifkan penutupan cepat tab/jendela - menjalankan penangan js saat pembongkaran di tab secara terpisah dari GUI.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1379,6 +1386,7 @@
 <translation id="2937174152333875430">Akatifkan sinkronisasi Peluncur Aplikasi</translation>
 <translation id="2938225289965773019">Membuka tautan <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">Mongolia</translation>
+<translation id="2941479658084239256">Aktifkan penyimpanan laman secara lokal untuk penggunaan offline.</translation>
 <translation id="2942290791863759244">Keyboard NEO 2 Jerman</translation>
 <translation id="2943400156390503548">Slide</translation>
 <translation id="2946119680249604491">Tambahkan koneksi</translation>
@@ -1400,6 +1408,7 @@
 <translation id="2966598748518102999">Tingkatkan penelusuran suara dengan mengirimkan suara "Ok Google", dan beberapa detik sebelumnya, ke Google.</translation>
 <translation id="2967544384642772068">Tutup</translation>
 <translation id="2968792643335932010">Lebih sedikit salinan</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">redupkan</translation>
 <translation id="2972557485845626008">Firmware</translation>
 <translation id="2972581237482394796">&amp;Ulang</translation>
@@ -1462,6 +1471,7 @@
 <translation id="3064388234319122767">Transliterasi (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Masukan tab yang ditutup.</translation>
 <translation id="3065140616557457172">Ketik untuk mencari atau masukkan URL untuk menavigasi - semuanya dapat digunakan.</translation>
+<translation id="3065351588762546748">Sambungan ke situs ini menggunakan versi protokol dan cipher suite yang kuat.</translation>
 <translation id="3067198360141518313">Jalankan plugin ini</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> telah dibuat sebagai pengguna yang dilindungi!</translation>
 <translation id="3075874217500066906">Anda perlu memulai ulang untuk memulai proses Powerwash. Setelah proses mulai ulang, Anda akan diminta untuk mengonfirmasi apakah ingin melanjutkan.</translation>
@@ -1641,6 +1651,7 @@
 <translation id="3308006649705061278">Unit Organisasi (OU)</translation>
 <translation id="3308116878371095290">Laman ini dicegah menyetel cookie.</translation>
 <translation id="3308134619352333507">Sembunyikan Tombol</translation>
+<translation id="3309747692199697901">Selalu Jalankan di Semua Situs</translation>
 <translation id="3313590242757056087">Untuk menyetel situs web yang dapat dilihat pengguna yang dilindungi, Anda dapat mengonfigurasi batasan
     dan setelan dengan mengunjungi <ph name="MANAGEMENT_URL" />.
     Jika Anda tidak mengubah setelan default, <ph name="USER_DISPLAY_NAME" />
@@ -1720,6 +1731,7 @@
 <translation id="3423858849633684918">Harap Luncurkan Ulang <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Tentukan jumlah untaian raster.</translation>
 <translation id="3428010780253032925">Nonaktifkan penargetan berbasis kotak pada tampilan</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{minimal 1 item pada perangkat yang disinkronkan}=1{1 item (dan beberapa di perangkat yang disinkronkan)}other{# item (dan beberapa di perangkat yang disinkronkan)}}</translation>
 <translation id="3429599832623003132">$1 item</translation>
 <translation id="3433621910545056227">Ups! Sistem gagal membuat kunci atribut waktu pemasangan perangkat.</translation>
 <translation id="343467364461911375">Beberapa layanan konten menggunakan pengenal mesin untuk mengidentifikasi Anda secara unik untuk tujuan memberi otorisasi akses kepada konten yang dilindungi.</translation>
@@ -2000,6 +2012,7 @@
 <translation id="3759933321830434300">Blokir bagian laman web</translation>
 <translation id="3760460896538743390">Periksa Laman Latar &amp;Belakang</translation>
 <translation id="37613671848467444">Buka di &amp;Jendela Penyamaran</translation>
+<translation id="3763401818161139108">Selalu jalankan di <ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Berkomunikasi dengan satu perangkat USB}other{Berkomunikasi dengan # perangkat USB}}</translation>
 <translation id="3764800135428056022">Tawaran menyimpan sandi web Anda.</translation>
 <translation id="3764986667044728669">Tidak dapat mendaftar</translation>
@@ -2224,6 +2237,7 @@
 <translation id="409579654357498729">Tambahkan ke Cloud Print</translation>
 <translation id="4096508467498758490">Nonaktifkan ekstensi mode pengembang</translation>
 <translation id="4098354747657067197">Situs yang akan dibuka berisi penipuan</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{tidak ada}=1{1}other{#}}</translation>
 <translation id="409980434320521454">Sinkronisasi gagal</translation>
 <translation id="4103763322291513355">Kunjungi &lt;strong&gt;chrome://policy&lt;/strong&gt; untuk melihat daftar URL yang masuk daftar hitam dan kebijakan lain yang diterapkan oleh administrator sistem Anda.</translation>
 <translation id="4104163789986725820">E&amp;kspor...</translation>
@@ -2437,6 +2451,7 @@
 <translation id="4439318412377770121">Ingin mendaftarkan <ph name="DEVICE_NAME" /> ke Perangkat Google Cloud?</translation>
 <translation id="4441124369922430666">Ingin memulai aplikasi ini secara otomatis saat komputer diaktifkan?</translation>
 <translation id="444134486829715816">Luaskan...</translation>
+<translation id="4442309605992420742">Aktifkan penyandingan Weave</translation>
 <translation id="444267095790823769">Pengecualian konten yang dilindungi</translation>
 <translation id="4443536555189480885">&amp;Bantuan</translation>
 <translation id="4444304522807523469">Mengakses pemindai dokumen yang terpasang melalui USB atau pada jaringan lokal</translation>
@@ -2498,6 +2513,7 @@
 <translation id="4545759655004063573">Tidak dapat menyimpan karena izin tidak memadai. Simpan ke lokasi lain.</translation>
 <translation id="4547659257713117923">Tidak Ada Tab dari Perangkat Lainnya</translation>
 <translation id="4547992677060857254">Folder yang Anda pilih berisi file sensitif. Apakah Anda yakin ingin memberikan izin pada "$1" untuk akses menulis secara permanen ke folder ini?</translation>
+<translation id="4552495056028768700">Akses Laman</translation>
 <translation id="4552678318981539154">Beli penyimpanan lagi</translation>
 <translation id="4554591392113183336">Versi ekstensi eksternal sama atau lebih rendah dibandingkan yang sudah ada.</translation>
 <translation id="4554796861933393312">Kecepatan Animasi Tetesan Tinta Desain Material</translation>
@@ -2760,6 +2776,7 @@
 <translation id="4920887663447894854">Situs berikut telah dicekal agar tidak melacak lokasi Anda pada laman ini:</translation>
 <translation id="492322146001920322">Strategi rilis tekanan memori konservatif</translation>
 <translation id="4923279099980110923">Ya, saya ingin membantu</translation>
+<translation id="4924202073934898868">Mengaktifkan penggunaan AppContainer pada proses dalam kotak pasir untuk meningkatkan keamanan.</translation>
 <translation id="4924638091161556692">Telah Diperbaiki</translation>
 <translation id="4925542575807923399">Administrator akun ini mewajibkan akun ini untuk menjadi akun masuk pertama dalam sesi fitur masuk banyak akun.</translation>
 <translation id="4927301649992043040">Kemas Ekstensi</translation>
@@ -3275,6 +3292,7 @@
 <translation id="5662457369790254286">Konfigurasi animasi bilah proses pemuatan laman ponsel Android.</translation>
 <translation id="5663459693447872156">Alihkan ke lebar paruh secara otomatis</translation>
 <translation id="5669267381087807207">Mengaktifkan</translation>
+<translation id="5669462439438204699">Simpan Kartu Kredit</translation>
 <translation id="5671961047338275645">Mengelola situs</translation>
 <translation id="5673305876422468017">Aktifkan Munculan Disambiguasi Tautan.</translation>
 <translation id="5676267133227121599">Akses sandi Anda dari perangkat apa pun di <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3469,6 +3487,7 @@
 <translation id="5941343993301164315">Harap masuk ke <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Perkecil</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Menonaktifkan kotak centang sederhanakan laman pada dialog pratinjau cetak</translation>
 <translation id="5945992478690277605">Mengaktifkan area pandang virtual cubit.</translation>
 <translation id="5946591249682680882">ID Laporan <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Tambahkan jaringan pribadi</translation>
@@ -3568,11 +3587,14 @@
         Jika masalah berlanjut, cobalah bersihkan cache.  Pada beberapa kejadian, hal ini
         juga menjadi pertanda mulai merosotnya kemampuan perangkat keras.</translation>
 <translation id="6084983096586510630">Khusus sambungan pihak pertama</translation>
+<translation id="6086814797483779854">Jalankan Saat Diklik</translation>
 <translation id="6086846494333236931">Dipasang oleh administrator Anda</translation>
+<translation id="6088898411501370207">Klien dan server tidak mendukung cipher suite atau versi protokol SSL umum. Hal ini biasanya terjadi apabila server memerlukan dukungan RC4 yang telah dihapus.</translation>
 <translation id="6089481419520884864">Laman saring</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Kartu Anda diverifikasi</translation>
 <translation id="6093888419484831006">Membatalkan pembaruan...</translation>
+<translation id="6094826672794738469">Layanan Alternatif.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Buka yang dimaksimalkan</translation>
 <translation id="6096326118418049043">X.500 Name</translation>
@@ -3719,7 +3741,6 @@
 <translation id="6333834492048057036">Memfokuskan bilah alamat untuk penelusuran</translation>
 <translation id="6339034549827494595">Keyboard Fonetik Rusia (AATSEEL)</translation>
 <translation id="6341850831632289108">Mendeteksi lokasi fisik Anda</translation>
-<translation id="6342069812937806050">Baru saja</translation>
 <translation id="634208815998129842">Pengelola tugas</translation>
 <translation id="6344170822609224263">Mengakses daftar sambungan jaringan</translation>
 <translation id="6344783595350022745">Hapus Teks</translation>
@@ -3769,6 +3790,7 @@
 <translation id="6417515091412812850">Tidak dapat memeriksa apakah sertifikat telah ditarik.</translation>
 <translation id="6418160186546245112">Mengembalikan ke versi <ph name="IDS_SHORT_PRODUCT_NAME" /> yang terpasang sebelumnya</translation>
 <translation id="6418481728190846787">Hapus akses untuk semua aplikasi secara permanen</translation>
+<translation id="6419708387665252597">Menonaktifkan sederhanakan laman pada pratinjau cetak</translation>
 <translation id="6419902127459849040">Eropa Tengah</translation>
 <translation id="6420676428473580225">Tambahkan ke Desktop</translation>
 <translation id="6422329785618833949">Foto dibalik</translation>
@@ -3899,6 +3921,7 @@
 <translation id="6588399906604251380">Aktifkan pemeriksaan ejaan</translation>
 <translation id="6589706261477377614">Tingkatkan kecerahan tombol</translation>
 <translation id="6592267180249644460">Log WebRTC direkam pada <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">kurang dari <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">terbaik</translation>
 <translation id="6596092346130528198">Apakah Ini Laman Tab Baru yang Anda Harapkan?</translation>
 <translation id="6596325263575161958">Opsi enkripsi</translation>
@@ -4116,6 +4139,7 @@
 <translation id="6948736568813450284">Untuk pengembang: gunakan layanan kotak pasir untuk panggilan API Google Payments.</translation>
 <translation id="6949306908218145636">Bookmark Laman Aktif...</translation>
 <translation id="695164542422037736">Jika opsi ini diaktifkan, dan badan disesuaikan dengan background-attachment:fixed, latar belakang akan memiliki lapisan penggabungan sendiri.</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> akan mengingat sandi dan membuat Anda masuk ke situs secara otomatis di perangkat ini.</translation>
 <translation id="6954850746343724854">Aktifkan Klien Asli untuk semua aplikasi web, bahkan klien yang tidak dipasang dari Toko Web Chrome.</translation>
 <translation id="6955446738988643816">Periksa Munculan</translation>
 <translation id="695755122858488207">Tombol radio yang tidak dipilih</translation>
@@ -4170,6 +4194,7 @@
 <translation id="7014051144917845222">Upaya koneksi <ph name="PRODUCT_NAME" /> ke <ph name="HOST_NAME" /> ditolak. Situs web mungkin sedang tidak aktif atau jaringan Anda tidak dikonfigurasi dengan benar.</translation>
 <translation id="7014174261166285193">Pemasangan gagal.</translation>
 <translation id="7015226785571892184">Aplikasi berikut akan diluncurkan jika Anda menyetujui permintaan ini: <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Penyandingan Weave digunakan oleh Aplikasi Weave untuk komunikasi yang aman dengan perangkat pada jaringan lokal.</translation>
 <translation id="7017004637493394352">Ucapkan "Ok Google" lagi</translation>
 <translation id="7017219178341817193">Tambahkan laman baru</translation>
 <translation id="7017354871202642555">Tidak dapat menyetel mode setelah jendela ditetapkan.</translation>
@@ -4501,6 +4526,7 @@
 <translation id="7503191893372251637">Netscape Certificate Type</translation>
 <translation id="7503821294401948377">Tidak dapat memuat ikon '<ph name="ICON" />' untuk tindakan browser.</translation>
 <translation id="750413812607578381">Anda harus memulai ulang <ph name="PRODUCT_NAME" /> sekarang.</translation>
+<translation id="7504483980780085481">Situs ini memberikan informasi Transparansi Sertifikat yang tidak valid.</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> ingin:</translation>
 <translation id="750509436279396091">Buka folder unduhan</translation>
 <translation id="7505167922889582512">Tampilkan file tersembunyi</translation>
@@ -4654,6 +4680,7 @@
 <translation id="7717536746040464035">Aktifkan kotak pasir perender seccomp-bpf</translation>
 <translation id="7719421816612904796">Waktu tunggu latihan telah berakhir</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7721392263035281016">Sambungan yang aman tidak dapat dibuat karena situs ini menggunakan protokol atau cipher suite yang tidak didukung. Hal ini biasanya terjadi apabila server memerlukan dukungan RC4 yang telah dihapus.</translation>
 <translation id="7724603315864178912">Potong</translation>
 <translation id="7730449930968088409">Menangkap konten layar Anda</translation>
 <translation id="7730494089396812859">Tampilkan detail cadangan Awan</translation>
@@ -4754,6 +4781,7 @@
 <translation id="7864539943188674973">Nonaktifkan Bluetooth</translation>
 <translation id="7870790288828963061">Tidak ada aplikasi Kios dengan versi lebih baru yang ditemukan. Tidak ada yang akan diperbarui. Lepaskan stik USB.</translation>
 <translation id="787150342916295244">Pemindaian kartu kredit</translation>
+<translation id="7874357055309047713">Selalu jalankan di semua situs</translation>
 <translation id="7876243839304621966">Hapus semua</translation>
 <translation id="7877451762676714207">Kesalahan server tidak diketahui. Coba lagi, atau hubungi administrator server.</translation>
 <translation id="7878999881405658917">Google telah mengirim pemberitahuan ke ponsel ini. Perhatikan bahwa jika Bluetooth diaktifkan, ponsel dapat membuat <ph name="DEVICE_TYPE" /> tetap terbuka dari jarak lebih dari 9 meter. Jika hal ini dapat menyebabkan masalah, &lt;a&gt;nonaktifkan fitur ini untuk sementara&lt;/a&gt;.</translation>
@@ -4793,6 +4821,7 @@
 <translation id="7918257978052780342">Daftarkan</translation>
 <translation id="7920092496846849526">Anda telah meminta izin kepada orang tua untuk mengunjungi laman ini.</translation>
 <translation id="7925285046818567682">Menunggu <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> akan mengingat sandi dan membuat Anda masuk ke aplikasi dan situs secara otomatis di semua perangkat.</translation>
 <translation id="7925686952655276919">Jangan gunakan data seluler untuk sinkronisasi</translation>
 <translation id="7926906273904422255">Menandai asal tidak aman sebagai tidak aman, atau sebagai "meragukan".</translation>
 <translation id="7928710562641958568">Keluarkan perangkat</translation>
@@ -4978,6 +5007,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">laman</translation>
 <translation id="8180786512391440389">"<ph name="EXTENSION" />" dapat membaca dan menghapus file gambar, video, dan suara di lokasi yang dicentang.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{tidak ada}=1{1 item}other{# item}}</translation>
 <translation id="8184538546369750125">Gunakan default global (Izinkan)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - Pemilik</translation>
 <translation id="8185331656081929126">Tampilkan pemberitahuan saat printer baru terdeteksi pada jaringan.</translation>
@@ -5043,6 +5073,7 @@
 <translation id="8263231521757761563">Penangan protokol aktif</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> telah menonaktifkan kursor mouse Anda.</translation>
 <translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" memicu layar penuh.</translation>
+<translation id="8267698848189296333">Masuk sebagai <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Kelola ekstensi Anda dengan mengeklik Ekstensi pada menu "Alat lainnya".</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> kini menjadi layar penuh dan ingin menyembunyikan kursor mouse Anda.</translation>
 <translation id="8275038454117074363">Impor</translation>
@@ -5156,6 +5187,8 @@
 <translation id="8435334418765210033">Jaringan yang diingat</translation>
 <translation id="8437209419043462667">AS</translation>
 <translation id="843730695811085446">Mengaktifkan rangka gaya aplikasi web untuk aplikasi yang dihosting, termasuk aplikasi bookmark. Saat ini hanya tersedia untuk Ash.</translation>
+<translation id="8437331208797669910">Akses laman</translation>
+<translation id="843760761634048214">Simpan kartu kredit</translation>
 <translation id="8438601631816548197">Tentang Penelusuran Suara</translation>
 <translation id="8439506636278576865">Tawarkan penerjemahan laman ke dalam bahasa ini</translation>
 <translation id="8442065444327205563">Dokumen Anda siap dilihat.</translation>
@@ -5577,6 +5610,7 @@
 <translation id="9039890312082871605">Nonaktifkan Tab</translation>
 <translation id="9040185888511745258">Penyerang di <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin berusaha mengelabui Anda agar memasang program yang membahayakan pengalaman penjelajahan (misalnya, dengan mengubah beranda Anda atau menayangkan iklan ekstra pada situs yang Anda kunjungi).</translation>
 <translation id="9040421302519041149">Akses jaringan ini dilindungi.</translation>
+<translation id="9040967476106479091">Pilih akun Anda dari <ph name="PASSWORD_MANAGER_BRAND" /> untuk masuk</translation>
 <translation id="9041603713188951722">Tampilkan setelan di jendela</translation>
 <translation id="904451693890288097">Masukkan kunci sandi untuk "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">Laman web di <ph name="URL" /> sudah tidak ada.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 8db63c4..25fa2f6 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3691,7 +3691,6 @@
 <translation id="6333834492048057036">Attivazione della barra degli indirizzi per la ricerca</translation>
 <translation id="6339034549827494595">Tastiera fonetica russa (AATSEEL)</translation>
 <translation id="6341850831632289108">Rilevamento della posizione fisica dell'utente</translation>
-<translation id="6342069812937806050">In questo momento</translation>
 <translation id="634208815998129842">Task Manager</translation>
 <translation id="6344170822609224263">Accesso all'elenco di connessioni di rete</translation>
 <translation id="6344783595350022745">Cancella testo</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 074bbbf..2c3d4a0b 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">הגדר עדכונים אוטומטיים לכל המשתמשים</translation>
 <translation id="1079766198702302550">חסום תמיד גישה למצלמה</translation>
+<translation id="1082398631555931481">‏<ph name="THIRD_PARTY_TOOL_NAME" /> רוצה לשחזר את הגדרות Chrome לברירת המחדל המקורית שלהן. הפעולה הזו תגרום לאיפוס דף הבית, דף הכרטיסייה החדשה ומנוע החיפוש, תשבית את התוספים ותבטל את ההצמדה של כל הכרטיסיות. כתוצאה מכך יימחקו גם נתונים אחרים מאחסון זמני ומהקובץ השמור, כמו נתונים של קובצי cookie, תוכן ואתרים.</translation>
 <translation id="108346963417674655">לא ניתן להתחבר בצורה מאובטחת אל השרת. ייתכן שהאתר הזה פעל בעבר, אך יש בעיה בשרת. התחברות אל אתרים כאלה פוגעת ברמת האבטחה של כל המשתמשים ולכן היא הושבתה.</translation>
 <translation id="1084538181352409184">‏בדוק את הגדרות שרת ה-proxy שלך, או צור קשר עם
           מנהל הרשת כדי לוודא ששרת ה-proxy פועל.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">קטלאנית</translation>
 <translation id="1156185823432343624">עוצמת קול: מושתקת</translation>
 <translation id="1156689104822061371">פריסת מקלדת:</translation>
+<translation id="1158274711289833876">‏חיבור מאובטח של TLS (אבטחת שכבת התעבורה)</translation>
 <translation id="1160536908808547677">כאשר מגדילים את התצוגה, רכיבים עם מיקום קבוע וסרגלי גלילה המותאמים לקנה מידה מצורפים לנקודת מבט זו.</translation>
 <translation id="1161575384898972166">היכנס אל <ph name="TOKEN_NAME" /> כדי לייצא את אישור הלקוח.</translation>
 <translation id="1162223735669141505">יש להפעיל <ph name="BEGIN_LINK" />פלאגין של לקוח מקומי<ph name="END_LINK" /> כדי להשתמש בתכונה הזו.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">הפעל תכונות נגישות על מנת להקל את השימוש במכשיר שלך.</translation>
 <translation id="1190144681599273207">הבאת קובץ זה תשתמש בערך ב-<ph name="FILE_SIZE" /> של נתונים לנייד.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{גישה אל קובץ המאוחסן במחשב שלך}two{גישה אל # קבצים המאוחסנים במחשב שלך}many{גישה אל # קבצים המאוחסנים במחשב שלך}other{גישה אל # קבצים המאוחסנים במחשב שלך}}</translation>
+<translation id="1190855992966397019">‏הפעל סגירת AppContainer.</translation>
 <translation id="1195447618553298278">שגיאה לא ידועה.</translation>
 <translation id="1196338895211115272">נכשל ייצוא מפתח פרטי.</translation>
 <translation id="1196789802623400962">הפעל/השבת את האפשרות של עריכת תנועה בדף ההגדרות של המקלדת הווירטואלית.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="123578888592755962">הדיסק מלא</translation>
 <translation id="1240892293903523606">‏בודק DOM</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> רוצה לאפס את ההגדרות שלך.</translation>
 <translation id="1243314992276662751">העלה</translation>
 <translation id="1244303850296295656">שגיאת תוסף</translation>
 <translation id="1248269069727746712">‏<ph name="PRODUCT_NAME" /> משתמש בהגדרות שרת ה-Proxy של המכשיר שלך כדי להתחבר לרשת.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">מוחק...</translation>
 <translation id="1339266338863469628">ברירת מחדל (קולט רק אותך)</translation>
 <translation id="1340527397989195812">גבה את המדיה מהמכשיר באמצעות אפליקציית 'קבצים'.</translation>
+<translation id="1341988552785875222">הטפט הנוכחי נקבע על ידי '<ph name="APP_NAME" />'. ייתכן שיהיה עליך להסיר את התקנת '<ph name="APP_NAME" />' כדי לבחור טפט אחר.</translation>
 <translation id="1343517687228689568">בטל את ההצמדה של דף זה למסך הפתיחה...</translation>
 <translation id="1344519653668879001">השבת ביקורת של היפר-קישור </translation>
 <translation id="1346104802985271895">‏שיטת קלט וייטנאמית (TELEX)</translation>
@@ -975,6 +980,7 @@
 <translation id="2421956571193030337">השתמש בתכונה זו עם חשבונות מהימנים בלבד.</translation>
 <translation id="2422426094670600218">&lt;ללא שם&gt;</translation>
 <translation id="2423578206845792524">שמ&amp;ור תמונה בשם...</translation>
+<translation id="2424091190911472304">הרץ תמיד ב-<ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">‏הוסף פרמטר שאילתה בכתובת אתר לרענון אוטומטי של הדף: chrome://network/?refresh=&lt;sec&gt;‎</translation>
 <translation id="2433507940547922241">מראה</translation>
 <translation id="2433728760128592593">‏הקש על ALT + SHIFT כדי לעבור בין שיטות קלט.</translation>
@@ -1294,6 +1300,7 @@
 <translation id="2841837950101800123">ספק</translation>
 <translation id="2843055980807544929">‏אם התכונה תושבת, Chrome יטפל ב-WM_KEY*‎ וב-WM_CHAR בנפרד.</translation>
 <translation id="2843806747483486897">שנה את ברירת המחדל...</translation>
+<translation id="2844111009524261443">הרץ בעת לחיצה</translation>
 <translation id="2845382757467349449">הצג תמיד את סרגל הסימניות</translation>
 <translation id="2846816712032308263">‏אפשרות לסגירה מהירה של כרטיסיות/חלונות -הפעלת המטפל onunload js של כרטיסייה בנפרד מממשק המשתמש הגרפי (GUI).</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1368,6 +1375,7 @@
 <translation id="2937174152333875430">הפעל סנכרון של מפעיל היישומים</translation>
 <translation id="2938225289965773019">לפתוח קישורי <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">מונגולית</translation>
+<translation id="2941479658084239256">אפשר אחסון דפים באופן מקומי לשימוש במצב לא מקוון.</translation>
 <translation id="2942290791863759244">‏מקלדת גרמנית NEO 2</translation>
 <translation id="2943400156390503548">שקופיות</translation>
 <translation id="2946119680249604491">הוסף חיבור</translation>
@@ -1389,6 +1397,7 @@
 <translation id="2966598748518102999">‏שפר את החיפוש הקולי על ידי שליחת הצליל "Ok Google," והקלטה של מספר שניות לפני כן, אל Google.</translation>
 <translation id="2967544384642772068">חסל</translation>
 <translation id="2968792643335932010">פחות עותקים</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">הפחתת בהירות</translation>
 <translation id="2972557485845626008">קושחה</translation>
 <translation id="2972581237482394796">&amp;בצע שנית</translation>
@@ -1451,6 +1460,7 @@
 <translation id="3064388234319122767">‏תעתוק (zdravo → здраво)</translation>
 <translation id="3065041951436100775">משוב על כרטיסייה שנסגרה.</translation>
 <translation id="3065140616557457172">הקלד לחיפוש או הזן כתובת אתר לניווט - שניהם עובדים.</translation>
+<translation id="3065351588762546748">החיבור לאתר הזה משתמש בחבילת צופן וגרסת פרוטוקול חזקות.</translation>
 <translation id="3067198360141518313">הרץ פלאגין זה</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> נוצר כמשתמש בפיקוח!</translation>
 <translation id="3075874217500066906">‏נדרשת הפעלה מחדש על מנת להתחיל את תהליך ה-Powerwash. לאחר ההפעלה מחדש תתבקש לאשר שברצונך להמשיך.</translation>
@@ -1629,6 +1639,7 @@
 <translation id="3308006649705061278">‏יחידה ארגונית (OU)</translation>
 <translation id="3308116878371095290">‏לא ניתן להגדיר קובצי Cookie לדף זה.</translation>
 <translation id="3308134619352333507">לחצן 'הסתר'</translation>
+<translation id="3309747692199697901">הרץ תמיד בכל האתרים</translation>
 <translation id="3313590242757056087">כדי להגדיר אילו אתרים המשתמש בפיקוח יכול להציג, ניתן להגדיר הגבלות
     והגדרות על ידי ביקור ב-<ph name="MANAGEMENT_URL" />.
     אם לא תשנה את הגדרות ברירת המחדל, <ph name="USER_DISPLAY_NAME" />
@@ -1707,6 +1718,7 @@
 <translation id="3423858849633684918">הפעל מחדש את <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">ציין את מספר שרשורי רשת הנקודות.</translation>
 <translation id="3428010780253032925">השבת מיקוד מבוסס-מלבן בתצוגות</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{לפחות פריט אחד במכשירים מסונכרנים}=1{פריט אחד (ועוד במכשירים מסונכרנים)}two{# פריטים (ועוד במכשירים מסונכרנים)}many{# פריטים (ועוד במכשירים מסונכרנים)}other{# פריטים (ועוד במכשירים מסונכרנים)}}</translation>
 <translation id="3429599832623003132">$1 פריטים</translation>
 <translation id="3433621910545056227">אופס!  המערכת לא הצליחה ליצור את נעילת התכונות של המכשיר המתרחשת בזמן ההתקנה.</translation>
 <translation id="343467364461911375">חלק משירותי התוכן משתמשים במזהי מחשבים כדי לזהות אותך באופן ייחודי על מנת להרשות גישה לתוכן מוגן.</translation>
@@ -1986,6 +1998,7 @@
 <translation id="3759933321830434300">חסימת חלקים של דפי אינטרנט</translation>
 <translation id="3760460896538743390">בדיקת דף ה&amp;רקע</translation>
 <translation id="37613671848467444">פתח בחלון &amp;גלישה בסתר</translation>
+<translation id="3763401818161139108">הרץ תמיד ב-<ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{‏תקשורת עם מכשיר USB אחד}two{‏תקשורת עם # מכשירי USB}many{‏תקשורת עם # מכשירי USB}other{‏תקשורת עם # מכשירי USB}}</translation>
 <translation id="3764800135428056022">הצע לשמור את סיסמאות האינטרנט שלך.</translation>
 <translation id="3764986667044728669">לא ניתן להירשם</translation>
@@ -2210,6 +2223,7 @@
 <translation id="409579654357498729">‏הוסף ל-Google Cloud Print</translation>
 <translation id="4096508467498758490">השבתת תוספים של מצב מפתח</translation>
 <translation id="4098354747657067197">זהירות, אתר מטעה</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{ללא}=1{אחת}two{#}many{#}other{#}}</translation>
 <translation id="409980434320521454">הסינכרון נכשל</translation>
 <translation id="4103763322291513355">‏בקר בכתובת &lt;strong&gt;chrome://policy&lt;/strong&gt; כדי לראות רשימה של כתובות אתרים שנמנעה אליהם הגישה, כמו גם תקנונים אחרים שנאכפו על ידי מנהל המערכת שלך.</translation>
 <translation id="4104163789986725820">יי&amp;צא...</translation>
@@ -2423,6 +2437,7 @@
 <translation id="4439318412377770121">‏האם ברצונך לרשום את <ph name="DEVICE_NAME" /> ל-Google Cloud Devices?</translation>
 <translation id="4441124369922430666">האם ברצונך להפעיל יישום זה באופן אוטומטי בעת הפעלת המחשב?</translation>
 <translation id="444134486829715816">הרחב...</translation>
+<translation id="4442309605992420742">‏הפעלה של התאמת Weave</translation>
 <translation id="444267095790823769">חריגים בתוכן מוגן</translation>
 <translation id="4443536555189480885">&amp;עזרה</translation>
 <translation id="4444304522807523469">‏גישה לסורקי מסמכים המחוברים באמצעות USB או ברשת המקומית</translation>
@@ -2483,6 +2498,7 @@
 <translation id="4545759655004063573">לא ניתן לשמור עקב הרשאות לא מספיקות. שמור במיקום אחר.</translation>
 <translation id="4547659257713117923">אין כרטיסיות ממכשירים אחרים</translation>
 <translation id="4547992677060857254">התיקיה שבחרת מכילה קבצים רגישים. האם אתה בטוח שברצונך להעניק ל-"$1" גישה קבועה לכתיבה בתיקיה זו?</translation>
+<translation id="4552495056028768700">גישה לדף</translation>
 <translation id="4552678318981539154">קנה עוד שטח אחסון</translation>
 <translation id="4554591392113183336">התוסף החיצוני הוא מגרסה זהה או קודמת לזו של התוסף הקיים.</translation>
 <translation id="4554796861933393312">מהירות אנימציה של טיפת דיו בעיצוב חדשני תלת-ממדי</translation>
@@ -2751,6 +2767,7 @@
 <translation id="4920887663447894854">האתרים הבאים נחסמו ממעקב אחר המיקום שלך בדף זה:</translation>
 <translation id="492322146001920322">אסטרטגיה שמרנית של שחרור לחץ על הזיכרון</translation>
 <translation id="4923279099980110923">כן, אני רוצה לעזור</translation>
+<translation id="4924202073934898868">‏מאפשר שימוש ב-AppContainer לתהליכים שהופעל להם ארגז חול כדי לשפר את האבטחה.</translation>
 <translation id="4924638091161556692">קבוע</translation>
 <translation id="4925542575807923399">מנהל המערכת עבור החשבון הזה דורש שהחשבון הזה יהיה הראשון שיבצעו עבורו כניסה בעת כניסה עם מספר חשבונות</translation>
 <translation id="4927301649992043040">ארוז תוסף</translation>
@@ -3266,6 +3283,7 @@
 <translation id="5662457369790254286">‏מגדיר את האנימציה של סרגל ההתקדמות לטעינת דף בטלפון Android.</translation>
 <translation id="5663459693447872156">עבור באופן אוטומטי לחצי רוחב</translation>
 <translation id="5669267381087807207">מפעיל</translation>
+<translation id="5669462439438204699">שמירת כרטיס אשראי</translation>
 <translation id="5671961047338275645">ניהול אתרים</translation>
 <translation id="5673305876422468017">הפעל חלון קופץ לבחירת קישור.</translation>
 <translation id="5676267133227121599">גש לסיסמאות שלך מכל מכשיר ב-<ph name="MANAGEMENT_LINK" />.</translation>
@@ -3458,6 +3476,7 @@
 <translation id="5941343993301164315">היכנס ל-<ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">מזער</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">השבת את תיבת הסימון 'פשט את הדף' בתיבת הדו-שיח 'תצוגה מקדימה של הדפסה'</translation>
 <translation id="5945992478690277605">הפעל נקודת מבט וירטואלית בצביטה.</translation>
 <translation id="5946591249682680882">מזהה דיווח <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">הוסף רשת פרטית</translation>
@@ -3557,11 +3576,14 @@
         אם הבעיה נמשכת, נסה לנקות את הקובץ השמור. במקרים מסוימים, הבעיה
         עשויה גם להצביע על כשל שמתחיל להיווצר בחומרה.</translation>
 <translation id="6084983096586510630">רק חיבורים של צד ראשון</translation>
+<translation id="6086814797483779854">הרץ בעת לחיצה</translation>
 <translation id="6086846494333236931">הותקן על ידי מנהל המערכת שלך</translation>
+<translation id="6088898411501370207">‏הלקוח והשרת אינם תומכים בגרסה נפוצה של פרוטוקול SSL או בחבילת צופן. בדרך כלל הדבר קורה כשהשרת זקוק לתמיכת RC4, אשר הוסרה.</translation>
 <translation id="6089481419520884864">זקק דף</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">הכרטיס אומת</translation>
 <translation id="6093888419484831006">מבטל עדכון...</translation>
+<translation id="6094826672794738469">שירותים חלופיים.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">פתח בגודל מרבי</translation>
 <translation id="6096326118418049043">‏שם X.500</translation>
@@ -3708,7 +3730,6 @@
 <translation id="6333834492048057036">מיקוד בסרגל כתובות לחיפוש</translation>
 <translation id="6339034549827494595">‏מקלדת רוסית פונטית (AATSEEL)</translation>
 <translation id="6341850831632289108">לזהות את המיקום הפיזי שלך</translation>
-<translation id="6342069812937806050">זה עתה</translation>
 <translation id="634208815998129842">מנהל המשימות</translation>
 <translation id="6344170822609224263">גישה לרשימת החיבורים לרשת</translation>
 <translation id="6344783595350022745">טקסט נקי</translation>
@@ -3758,6 +3779,7 @@
 <translation id="6417515091412812850">לא ניתן לבדוק אם האישור נשלל.</translation>
 <translation id="6418160186546245112">חוזר לגרסה המותקנת הקודמת של <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">הסר לצמיתות גישה עבור כל היישומים</translation>
+<translation id="6419708387665252597">השבת פישוט דף בתצוגה מקדימה של ההדפסה</translation>
 <translation id="6419902127459849040">מרכז אירופאית</translation>
 <translation id="6420676428473580225">הוספה לשולחן העבודה</translation>
 <translation id="6422329785618833949">התמונה סובבה</translation>
@@ -3890,6 +3912,7 @@
 <translation id="6588399906604251380">הפעל בדיקת איות</translation>
 <translation id="6589706261477377614">הגבר את בהירות המקשים</translation>
 <translation id="6592267180249644460">‏יומני WebRTC תועדו בתאריך <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">פחות מ-<ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">מומלץ ביותר</translation>
 <translation id="6596092346130528198">האם זהו דף הכרטיסייה החדשה שציפית לראות?</translation>
 <translation id="6596325263575161958">אפשרויות הצפנה</translation>
@@ -4106,6 +4129,7 @@
 <translation id="6948736568813450284">‏אם אתה מפתח: השתמש בשירות ארגז החול לקריאות ממשק ה-API של Google Payments.</translation>
 <translation id="6949306908218145636">הוספת דפים פתוחים לסימניות...</translation>
 <translation id="695164542422037736">‏אם אפשרות זו מופעלת, ואם גוף הטקסט מעוצב עם background-attachment:fixed, לרקע תהיה שכבה מורכבת משלו.</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> זוכר את הסיסמאות שלך ומכניס אותך לאתרים באופן אוטומטי במכשיר הזה.</translation>
 <translation id="6954850746343724854">‏אפשר Native Client עבור כל יישומי האינטרנט, גם כאלה שלא הותקנו מחנות האינטרנט של Chrome.</translation>
 <translation id="6955446738988643816">בדוק חלון מוקפץ</translation>
 <translation id="695755122858488207">לחצן בחירה שלא נבחר</translation>
@@ -4160,6 +4184,7 @@
 <translation id="7014051144917845222">הניסיון של <ph name="PRODUCT_NAME" /> להתחבר אל <ph name="HOST_NAME" /> נדחה. ייתכן שהאתר מושבת או שתצורת הרשת שלך אינה מוגדרת כהלכה.</translation>
 <translation id="7014174261166285193">ההתקנה נכשלה.</translation>
 <translation id="7015226785571892184">היישום הבא יופעל אם תאשר בקשה זו: <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">‏התאמת Weave משמשת את אפליקציית Weave לתקשורת מאובטחת עם מכשירים ברשת מקומית.</translation>
 <translation id="7017004637493394352">‏אמור שוב "Ok Google"</translation>
 <translation id="7017219178341817193">הוסף דף חדש</translation>
 <translation id="7017354871202642555">לא ניתן להגדיר מצב לאחר שהחלון הוגדר.</translation>
@@ -4485,6 +4510,7 @@
 <translation id="7503191893372251637">‏סוג אישור Netscape</translation>
 <translation id="7503821294401948377">לא היתה אפשרות לטעון את האייקון '<ph name="ICON" />' עבור פעולת דפדפן.</translation>
 <translation id="750413812607578381">עליך להפעיל מחדש את <ph name="PRODUCT_NAME" /> כעת.</translation>
+<translation id="7504483980780085481">האתר הזה סיפק פרטים לא חוקיים של שקיפות אישור.</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> רוצה:</translation>
 <translation id="750509436279396091">פתח את תיקיית ההורדות</translation>
 <translation id="7505167922889582512">הצג קבצים מוסתרים</translation>
@@ -4634,6 +4660,7 @@
 <translation id="7717536746040464035">‏הפעל את ה-Sandbox של המעבד seccomp-bpf</translation>
 <translation id="7719421816612904796">תם הזמן הקצוב לאימון</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7721392263035281016">‏לא ניתן ליצור חיבור מאובטח כיוון שהאתר משתמש בפרוטוקול או בחבילת צופן שאינם נתמכים. בדרך כלל הדבר קורה כשהשרת זקוק לתמיכת RC4, אשר הוסרה.</translation>
 <translation id="7724603315864178912">חתוך</translation>
 <translation id="7730449930968088409">צילום של תוכן המסך</translation>
 <translation id="7730494089396812859">הצג פרטים של גיבוי בענן</translation>
@@ -4734,6 +4761,7 @@
 <translation id="7864539943188674973">‏השבת Bluetooth</translation>
 <translation id="7870790288828963061">לא נמצאו אפליקציות קיוסק בגרסה חדשה יותר. אין צורך בעדכון. הסר את הדיסק און קי.</translation>
 <translation id="787150342916295244">סריקת כרטיס אשראי</translation>
+<translation id="7874357055309047713">הרץ תמיד בכל האתרים</translation>
 <translation id="7876243839304621966">הסר הכל</translation>
 <translation id="7877451762676714207">שגיאת שרת לא ידועה. נסה שוב או פנה למנהל השרת.</translation>
 <translation id="7878999881405658917">‏Google שלחה הודעה לטלפון הזה. לידיעתך, עם Bluetooth, הטלפון שלך עשוי להשאיר את <ph name="DEVICE_TYPE" /> לא נעול במרחק של מעל 3 מטרים. אם הדבר מהווה בעיה מבחינתך, תוכל &lt;a&gt;להשבית זמנית את התכונה הזו&lt;/a&gt;.</translation>
@@ -4773,6 +4801,7 @@
 <translation id="7918257978052780342">הירשם</translation>
 <translation id="7920092496846849526">שאלת את ההורים אם זה בסדר לבקר בדף זה.</translation>
 <translation id="7925285046818567682">ממתין ל- <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> זוכר את הסיסמאות שלך ומכניס אותך ליישומים ולאתרים באופן אוטומטי בכל המכשירים.</translation>
 <translation id="7925686952655276919">אין להשתמש בנתונים ניידים עבור סנכרון</translation>
 <translation id="7926906273904422255">סמן מקורות לא מאובטחים כ'לא מאובטחים' או כ'מפוקפקים'.</translation>
 <translation id="7928710562641958568">הוצא את המכשיר</translation>
@@ -4958,6 +4987,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">דף</translation>
 <translation id="8180786512391440389">"<ph name="EXTENSION" />" יכול לקרוא ולמחוק קובצי תמונות, וידאו ואודיו במיקומים המסומנים.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{ללא}=1{פריט אחד}two{שני פריטים}many{# פריטים}other{# פריטים}}</translation>
 <translation id="8184538546369750125">השתמש בברירת המחדל הכללית (אפשר)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - בעלים</translation>
 <translation id="8185331656081929126">הצג הודעות כאשר מזוהות מדפסות חדשות ברשת</translation>
@@ -5023,6 +5053,7 @@
 <translation id="8263231521757761563">תוכניות פעילות לטיפול בפרוטוקולים</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> השבית את סמן העכבר.</translation>
 <translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" הפעיל מסך מלא.</translation>
+<translation id="8267698848189296333">נכנס כ-<ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">נהל את התוספים שלך על ידי לחיצה על 'תוספים' בתפריט 'כלים נוספים'.</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> הוא כעת במסך מלא וברצונו להשבית את סמן העכבר שלך.</translation>
 <translation id="8275038454117074363">ייבוא</translation>
@@ -5136,6 +5167,8 @@
 <translation id="8435334418765210033">רשתות השמורות בזיכרון</translation>
 <translation id="8437209419043462667">ארה"ב</translation>
 <translation id="843730695811085446">‏מפעיל את מסגרת סגנון אפליקציית האינטרנט עבור אפליקציות מתארחות, כולל אפליקציות של סימניות. כרגע הדבר זמין רק עבור Ash.</translation>
+<translation id="8437331208797669910">גישה לדף</translation>
+<translation id="843760761634048214">שמירת כרטיס אשראי</translation>
 <translation id="8438601631816548197">מידע על חיפוש קולי</translation>
 <translation id="8439506636278576865">הצעות לתרגום דפים שנכתבו בשפה זו</translation>
 <translation id="8442065444327205563">המסמך מוכן להצגה.</translation>
@@ -5556,6 +5589,7 @@
 <translation id="9039890312082871605">השתקת כרטיסיות</translation>
 <translation id="9040185888511745258">תוקפים ב-<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> עשויים לנסות להערים עליך ולגרום לך להתקין תוכניות שיפגעו בחוויית הגלישה שלך (לדוגמה, על ידי שינוי דף הבית או הצגת מודעות נוספות באתרים שבהם אתה מבקר).</translation>
 <translation id="9040421302519041149">הגישה לרשת זו מוגנת.</translation>
+<translation id="9040967476106479091">בחירת החשבון שלך מ-<ph name="PASSWORD_MANAGER_BRAND" /> לכניסה</translation>
 <translation id="9041603713188951722">הצג הגדרות בחלון</translation>
 <translation id="904451693890288097">הזן סיסמה עבור "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">דף האינטרנט שב-<ph name="URL" /> אינו קיים יותר.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index e60e9f9..9eff371 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -3719,7 +3719,6 @@
 <translation id="6333834492048057036">検索のためアドレスバーにフォーカスを移動</translation>
 <translation id="6339034549827494595">ロシア語表音(AATSEEL)キーボード</translation>
 <translation id="6341850831632289108">現在地を検出する</translation>
-<translation id="6342069812937806050">たった今</translation>
 <translation id="634208815998129842">タスク マネージャ</translation>
 <translation id="6344170822609224263">ネットワーク接続のリストにアクセスする</translation>
 <translation id="6344783595350022745">テキストを消去</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index b066f03..9066289 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -3722,7 +3722,6 @@
 <translation id="6333834492048057036">ಹುಡುಕುವುದಕ್ಕೆ ವಿಳಾಸ ಪಟ್ಟಿಯನ್ನು ಗಮನಿಸಿ</translation>
 <translation id="6339034549827494595">ರಷ್ಯನ್ ಫೋನೆಟಿಕ್ (AATSEEL) ಕೀಬೋರ್ಡ್</translation>
 <translation id="6341850831632289108">ನಿಮ್ಮ ದೈಹಿಕ ಸ್ಥಾನವನ್ನು ಪತ್ತೆಹಚ್ಚಿ</translation>
-<translation id="6342069812937806050">ಇದೀಗ</translation>
 <translation id="634208815998129842">ಕಾರ್ಯ ನಿರ್ವಾಹಕ</translation>
 <translation id="6344170822609224263">ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕಗಳ ಪಟ್ಟಿಯನ್ನು ಪ್ರವೇಶಿಸಿ</translation>
 <translation id="6344783595350022745">ಪಠ್ಯವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index f760b6c..4f105d3 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -3731,7 +3731,6 @@
 <translation id="6333834492048057036">검색을 위해 주소 표시줄로 이동</translation>
 <translation id="6339034549827494595">러시아 표음식(AATSEEL) 키보드</translation>
 <translation id="6341850831632289108">실제 위치 감지</translation>
-<translation id="6342069812937806050">완료됨</translation>
 <translation id="634208815998129842">작업 관리자</translation>
 <translation id="6344170822609224263">네트워크 연결 목록에 액세스</translation>
 <translation id="6344783595350022745">텍스트 삭제</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index c88b84f..d215aed 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -3733,7 +3733,6 @@
 <translation id="6333834492048057036">Aktyvinti adreso juostą ir ieškoti</translation>
 <translation id="6339034549827494595">Rusiška fonetinė (AATSEEL) klaviatūra</translation>
 <translation id="6341850831632289108">Aptikti buvimo vietą</translation>
-<translation id="6342069812937806050">Ką tik</translation>
 <translation id="634208815998129842">Užduočių tvarkytuvė</translation>
 <translation id="6344170822609224263">Pasiekti tinklo ryšių sąrašą</translation>
 <translation id="6344783595350022745">Išvalyti tekstą</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 3246007..1dbc91e 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3728,7 +3728,6 @@
 <translation id="6333834492048057036">Iezīmē adreses joslu meklēšanai</translation>
 <translation id="6339034549827494595">Krievu fonētiskā (AATSEEL) tastatūra</translation>
 <translation id="6341850831632289108">Noteikt jūsu fizisko atrašanās vietu</translation>
-<translation id="6342069812937806050">Tikko</translation>
 <translation id="634208815998129842">Uzdevumu pārvaldnieks</translation>
 <translation id="6344170822609224263">Piekļūt tīkla savienojumu sarakstam</translation>
 <translation id="6344783595350022745">Notīrīt tekstu</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 0e36d934..afbf6582 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -3729,7 +3729,6 @@
 <translation id="6333834492048057036">തിരയലിനുള്ള വിലാസ ബാർ ഫോക്കസുചെയ്യുക</translation>
 <translation id="6339034549827494595">റഷ്യൻ ഫൊണറ്റിക് (AATSEEL) കീബോർഡ്</translation>
 <translation id="6341850831632289108">നിങ്ങളുടെ ഭൗതിക ലൊക്കേഷൻ കണ്ടെത്തുക</translation>
-<translation id="6342069812937806050">ഇപ്പോള്‍‌</translation>
 <translation id="634208815998129842">ടാസ്‌ക് മാനേജർ</translation>
 <translation id="6344170822609224263">നെറ്റ്‌വർക്ക് കണക്ഷനുകളുടെ ലിസ്റ്റ് ആക്‌സസ്സുചെയ്യുക</translation>
 <translation id="6344783595350022745">വാചകം മായ്‌ക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index cf595c1..037770c5 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -3724,7 +3724,6 @@
 <translation id="6333834492048057036">शोधासाठी अ‍ॅड्रेस बार वर फोकस करा</translation>
 <translation id="6339034549827494595">रशियन ध्वन्यात्मक (AATSEEL) कीबोर्ड</translation>
 <translation id="6341850831632289108">आपले प्रत्यक्ष स्थान तपासा</translation>
-<translation id="6342069812937806050">आत्ताच</translation>
 <translation id="634208815998129842">कार्य व्यवस्थापक</translation>
 <translation id="6344170822609224263">नेटवर्क कनेक्शनच्या सूचीवर प्रवेश करा</translation>
 <translation id="6344783595350022745">मजकूर साफ करा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 8189a74..188c3ce 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Sediakan Kemas Kini Automatik untuk Semua Pengguna</translation>
 <translation id="1079766198702302550">Sentiasa sekat akses kamera</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> mahu memulihkan tetapan Chrome anda kepada tetapan lalainya yang asal. Ini akan menetap semula halaman utama, halaman tab baharu dan enjin carian anda, melumpuhkan sambungan anda dan menyahsemat semua tab. Data sementara yang lain dan data cache anda, seperti data kuki, kandungan dan tapak akan turut dikosongkan.</translation>
 <translation id="108346963417674655">Tidak dapat menyambung ke pelayan dengan selamat. Tapak web ini mungkin berfungsi sebelum ini tetapi terdapat masalah dengan pelayan. Penyambungan ke tapak sedemikian melemahkan keselamatan bagi semua pengguna dan dengan itu telah dilumpuhkan.</translation>
 <translation id="1084538181352409184">Semak tetapan proksi anda atau hubungi pentadbir rangkaian anda untuk
           memastikan pelayan proksi berfungsi.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">Bahasa Catalan</translation>
 <translation id="1156185823432343624">Kelantangan: Diredam</translation>
 <translation id="1156689104822061371">Susun atur papan kekunci:</translation>
+<translation id="1158274711289833876">Sambungan TLS selamat</translation>
 <translation id="1160536908808547677">Apabila zum masuk, unsur kedudukan tetap dan bar tatal berskala dilampirkan dengan port pandangan ini.</translation>
 <translation id="1161575384898972166">Sila log masuk ke <ph name="TOKEN_NAME" /> untuk mengeksport sijil klien.</translation>
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Pemalam Klien Asli<ph name="END_LINK" /> perlu didayakan untuk menggunakan ciri ini.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">Dayakan ciri kebolehcapaian untuk menjadikan peranti anda lebih mudah digunakan.</translation>
 <translation id="1190144681599273207">Pengambilan fail ini akan menggunakan kira-kira <ph name="FILE_SIZE" /> data mudah alih.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Akses fail yang disimpan pada komputer anda}other{Akses # fail yang disimpan pada komputer anda}}</translation>
+<translation id="1190855992966397019">Dayakan Kunci Semua AppContainer</translation>
 <translation id="1195447618553298278">Ralat tidak diketahui.</translation>
 <translation id="1196338895211115272">Gagal untuk mengeksport kunci persendirian.</translation>
 <translation id="1196789802623400962">Dayakan/Lumpuhkan pilihan pengeditan gerak isyarat di halaman tetapan untuk papan kekunci maya.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">Pekerja Perkhidmatan</translation>
 <translation id="123578888592755962">Cakera penuh</translation>
 <translation id="1240892293903523606">Pemeriksa DOM</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> mahu menetapkan semula tetapan anda.</translation>
 <translation id="1243314992276662751">Muat naik</translation>
 <translation id="1244303850296295656">Ralat sambungan</translation>
 <translation id="1248269069727746712"><ph name="PRODUCT_NAME" /> menggunakan tetapan proksi sistem peranti anda untuk bersambung ke rangkaian.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">Memadamkan...</translation>
 <translation id="1339266338863469628">Lalai (ambil anda sahaja)</translation>
 <translation id="1340527397989195812">Sandarkan media dari peranti menggunakan apl Fail.</translation>
+<translation id="1341988552785875222">Kertas dinding semasa ditetapkan oleh ' <ph name="APP_NAME" /> '. Anda mungkin perlu menyahpasang ' <ph name="APP_NAME" /> 'sebelum memilih kertas dinding lain.</translation>
 <translation id="1343517687228689568">Nyahpin halaman ini dari skrin Mula...</translation>
 <translation id="1344519653668879001">Lumpuhkan pengauditan hiperpautan</translation>
 <translation id="1346104802985271895">Kaedah input bahasa Vietnam (TELEX)</translation>
@@ -996,6 +1001,7 @@
 <translation id="2421956571193030337">Hanya gunakan ciri ini dengan akaun yang anda percayai.</translation>
 <translation id="2422426094670600218">&lt;tiada nama&gt;</translation>
 <translation id="2423578206845792524">Si&amp;mpan imej sebagai...</translation>
+<translation id="2424091190911472304">Sentiasa Jalankan pada <ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">Tambahkan parameter pertanyaan dalam URL untuk auto muat semula halaman: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Tampilan</translation>
 <translation id="2433728760128592593">Tekan Alt+Shift untuk saling beralih kaedah input.</translation>
@@ -1316,6 +1322,7 @@
 <translation id="2841837950101800123">Penyedia</translation>
 <translation id="2843055980807544929">Jika dilumpuhkan, Chrome akan mengendalikan WM_KEY * dan WM_CHAR secara berasingan.</translation>
 <translation id="2843806747483486897">Tukar lalai...</translation>
+<translation id="2844111009524261443">Jalankan apabila diklik</translation>
 <translation id="2845382757467349449">Sentiasa Paparkan Bar Penanda Halaman</translation>
 <translation id="2846816712032308263">Membolehkan penutupan pantas tab/tetingkap - menjalankan pengendali js onunload tab secara berasingan daripada GUI.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1390,6 +1397,7 @@
 <translation id="2937174152333875430">Dayakan Penyegerakan Pelancar Apl</translation>
 <translation id="2938225289965773019">Buka pautan <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">Bahasa Mongolia</translation>
+<translation id="2941479658084239256">Dayakan penyimpanan halaman dalam pemacu setempat untuk kegunaan luar talian.</translation>
 <translation id="2942290791863759244">Papan kekunci NEO 2 bahasa Jerman</translation>
 <translation id="2943400156390503548">Slaid</translation>
 <translation id="2946119680249604491">Tambah sambungan</translation>
@@ -1411,6 +1419,7 @@
 <translation id="2966598748518102999">Tingkatkan carian suara dengan menghantar bunyi "Ok Google" dan beberapa saat sebelum itu, kepada Google.</translation>
 <translation id="2967544384642772068">Matikan</translation>
 <translation id="2968792643335932010">Kurang salinan</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">kurangkan kecerahan</translation>
 <translation id="2972557485845626008">Perisian tegar</translation>
 <translation id="2972581237482394796">&amp;Buat Semula</translation>
@@ -1473,6 +1482,7 @@
 <translation id="3064388234319122767">Pengalihan huruf (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Maklum balas tab dibunuh.</translation>
 <translation id="3065140616557457172">Taip untuk mencari atau memasukkan URL untuk menavigasi - semua boleh digunakan.</translation>
+<translation id="3065351588762546748">Sambungan ke tapak ini menggunakan versi protokol yang kuat dan suit sifer.</translation>
 <translation id="3067198360141518313">Jalankan pemalam ini</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> telah dihasilkan sebagai pengguna diselia!</translation>
 <translation id="3075874217500066906">Mula semula perlu dilakukan untuk memulakan proses Powerwash. Selepas memulakan semula, anda akan diminta mengesahkan bahawa anda ingin meneruskan.</translation>
@@ -1652,6 +1662,7 @@
 <translation id="3308006649705061278">Unit Organisasi (OU)</translation>
 <translation id="3308116878371095290">Halaman ini dihalang daripada menetapkan kuki.</translation>
 <translation id="3308134619352333507">Sembunyikan Butang</translation>
+<translation id="3309747692199697901">Sentiasa Jalankan pada Semua Tapak</translation>
 <translation id="3313590242757056087">Untuk menetapkan tapak web yang boleh dilihat oleh pengguna diselia,
     anda boleh mengkonfigurasi sekatan dan tetapan dengan melawati <ph name="MANAGEMENT_URL" />.
     Jika anda tidak mengubah tetapan lalai, <ph name="USER_DISPLAY_NAME" />
@@ -1730,6 +1741,7 @@
 <translation id="3423858849633684918">Sila Lancarkan Semula <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Nyatakan bilangan urutan raster.</translation>
 <translation id="3428010780253032925">Lumpuhkan penyasaran berdasarkan segi empat bujur dalam paparan</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{sekurang-kurangnya 1 item pada peranti yang disegerakkan}=1{1 item (dan beberapa lagi pada peranti yang disegerakkan)}other{# item (dan beberapa lagi pada peranti yang disegerakkan)}}</translation>
 <translation id="3429599832623003132">$1 item</translation>
 <translation id="3433621910545056227">Op! Sistem gagal mewujudkan kunci atribut masa pemasangan peranti.</translation>
 <translation id="343467364461911375">Sesetengah perkhidmatan kandungan menggunakan pengecam mesin untuk mengenal pasti anda secara unik bagi maksud membenarkan akses kepada kandungan yang dilindungi.</translation>
@@ -2010,6 +2022,7 @@
 <translation id="3759933321830434300">Sekat sebahagian halaman web</translation>
 <translation id="3760460896538743390">Halaman Periksa &amp;Latar Belakang</translation>
 <translation id="37613671848467444">Buka dalam Tetingkap &amp;Inkognito</translation>
+<translation id="3763401818161139108">Sentiasa jalankan pada <ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Berkomunikasi dengan peranti USB}other{Berkomunikasi dengan # peranti USB}}</translation>
 <translation id="3764800135428056022">Tawaran untuk menyimpan kata laluan web anda.</translation>
 <translation id="3764986667044728669">Tidak dapat mendaftar</translation>
@@ -2234,6 +2247,7 @@
 <translation id="409579654357498729">Tambahkan pada Cetakan Awan</translation>
 <translation id="4096508467498758490">Lumpuhkan sambungan mod pembangun</translation>
 <translation id="4098354747657067197">Tapak menipu di hadapan</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{tiada}=1{1}other{#}}</translation>
 <translation id="409980434320521454">Penyegerakan gagal</translation>
 <translation id="4103763322291513355">Lawati &lt;strong&gt;chrome://policy&lt;/strong&gt; untuk melihat senarai URL yang disenarai hitam dan dasar lain yang dikuatkuasakan oleh pentadbir sistem anda.</translation>
 <translation id="4104163789986725820">E&amp;ksport...</translation>
@@ -2447,6 +2461,7 @@
 <translation id="4439318412377770121">Adakah anda ingin mendaftar <ph name="DEVICE_NAME" /> ke Peranti Awan Google?</translation>
 <translation id="4441124369922430666">Adakah anda ingin mulakan apl ini secara automatik apabila mesin ini dihidupkan?</translation>
 <translation id="444134486829715816">Kembangkan...</translation>
+<translation id="4442309605992420742">Dayakan penggandingan Weave</translation>
 <translation id="444267095790823769">Pengecualian kandungan yang dilindungi</translation>
 <translation id="4443536555189480885">&amp;Bantuan</translation>
 <translation id="4444304522807523469">Akses pengimbas dokumen yang disambungkan melalui USB atau pada rangkaian tempatan</translation>
@@ -2508,6 +2523,7 @@
 <translation id="4545759655004063573">Tidak dapat menyimpan kerana kebenaran yang tidak mencukupi. Sila simpan ke lokasi yang lain.</translation>
 <translation id="4547659257713117923">Tiada Tab daripada Peranti Lain</translation>
 <translation id="4547992677060857254">Folder yang anda pilih mengandungi fail sensitif. Adakah anda pasti mahu memberikan "$1" akses menulis tetap kepada folder ini?</translation>
+<translation id="4552495056028768700">Akses Halaman</translation>
 <translation id="4552678318981539154">Beli lagi storan</translation>
 <translation id="4554591392113183336">Sambungan luar ialah versi yang sama atau lebih rendah berbanding yang sedia ada.</translation>
 <translation id="4554796861933393312">Kelajuan Animasi Titisan Dakwat Reka Bentuk Bahan</translation>
@@ -2777,6 +2793,7 @@
 <translation id="4920887663447894854">Tapak berikut telah disekat daripada menjejaki lokasi anda pada halaman ini:</translation>
 <translation id="492322146001920322">Strategi keluaran tekanan memori konservatif</translation>
 <translation id="4923279099980110923">Ya, saya ingin membantu</translation>
+<translation id="4924202073934898868">Mendayakan penggunaan AppContainer pada proses berkotak pasir untuk meningkatkan keselamatan.</translation>
 <translation id="4924638091161556692">Dibetulkan</translation>
 <translation id="4925542575807923399">Pentadbir akaun ini memerlukan akaun ini menjadi akaun dilog masuk yang pertama dalam sesi berbilang log masuk.</translation>
 <translation id="4927301649992043040">Sambungan Pek</translation>
@@ -3292,6 +3309,7 @@
 <translation id="5662457369790254286">Mengkonfigurasikan animasi bar kemajuan pemuatan halaman telefon Android.</translation>
 <translation id="5663459693447872156">Beralih kepada lebar separa secara automatik</translation>
 <translation id="5669267381087807207">Mengaktifkan</translation>
+<translation id="5669462439438204699">Simpan Kad Kredit</translation>
 <translation id="5671961047338275645">Mengurus tapak</translation>
 <translation id="5673305876422468017">Dayakan Gelembung Timbul Penyahtaksaan Pautan.</translation>
 <translation id="5676267133227121599">Akses kata laluan anda daripada mana-mana peranti di <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3486,6 +3504,7 @@
 <translation id="5941343993301164315">Sila log masuk ke <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimumkan</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Lumpuhkan kotak pilihan halaman ringkas pada dialog pratonton cetakan</translation>
 <translation id="5945992478690277605">Dayakan port pandangan maya cubitan.</translation>
 <translation id="5946591249682680882">ID Laporan <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Tambah rangkaian persendirian</translation>
@@ -3585,11 +3604,14 @@
         Jika masalah berterusan, cuba padam bersih cache.  Dalam beberapa kes, ini
         juga boleh menjadi simptom perkakasan mula gagal.</translation>
 <translation id="6084983096586510630">Sambungan pihak pertama sahaja</translation>
+<translation id="6086814797483779854">Jalankan apabila Diklik</translation>
 <translation id="6086846494333236931">Dipasang oleh pentadbir anda</translation>
+<translation id="6088898411501370207">Pelanggan dan pelayan tidak menyokong versi protokol SSL atau set sifer biasa. Biasanya, punca hal ini berlaku ialah apabila pelayan memerlukan sokongan RC4 yang telah dialih keluar.</translation>
 <translation id="6089481419520884864">Menyuling halaman</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Kad anda disahkan</translation>
 <translation id="6093888419484831006">Membatalkan kemas kini...</translation>
+<translation id="6094826672794738469">Perkhidmatan Alternatif.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Buka Dimaksimumkan</translation>
 <translation id="6096326118418049043">X.500 Nama</translation>
@@ -3736,7 +3758,6 @@
 <translation id="6333834492048057036">Fokus bar alamat untuk carian</translation>
 <translation id="6339034549827494595">Papan kekunci Fonetik Rusia (AATSEEL)</translation>
 <translation id="6341850831632289108">Kesan lokasi fizikal anda</translation>
-<translation id="6342069812937806050">Sebentar tadi</translation>
 <translation id="634208815998129842">Pengurus tugas</translation>
 <translation id="6344170822609224263">Akses senarai sambungan rangkaian</translation>
 <translation id="6344783595350022745">Padamkan Teks</translation>
@@ -3786,6 +3807,7 @@
 <translation id="6417515091412812850">Tidak dapat memeriksa sama ada sijil telah dibatalkan.</translation>
 <translation id="6418160186546245112">Berbalik kepada versi <ph name="IDS_SHORT_PRODUCT_NAME" /> yang dipasang sebelum ini</translation>
 <translation id="6418481728190846787">Mengalih keluar akses bagi semua apl secara kekal</translation>
+<translation id="6419708387665252597">Lumpuhkan halaman ringkas pada pratonton cetakan</translation>
 <translation id="6419902127459849040">Eropah Tengah</translation>
 <translation id="6420676428473580225">Tambahkan pada Desktop</translation>
 <translation id="6422329785618833949">Foto diterbalikkan</translation>
@@ -3911,6 +3933,7 @@
 <translation id="6588399906604251380">Dayakan penyemakan ejaan</translation>
 <translation id="6589706261477377614">Tingkatkan kecerahan kekunci</translation>
 <translation id="6592267180249644460">Log WebRTC dirakam <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">kurang daripada <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">terbaik</translation>
 <translation id="6596092346130528198">Adakah Ini Halaman Tab Baharu Yang Anda Jangkakan?</translation>
 <translation id="6596325263575161958">Pilihan penyulitan</translation>
@@ -4132,6 +4155,7 @@
 <translation id="6948736568813450284">Untuk pembangun: gunakan perkhidmatan kotak pasir untuk panggilan API Google Payments.</translation>
 <translation id="6949306908218145636">Tandakan Halaman Terbuka...</translation>
 <translation id="695164542422037736">Jika pilihan ini didayakan, dan jika isi digayakan dengan background-attachment:fixed, latar belakang tersebut akan mempunyai lapisan gubahannya sendiri.</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> ingat kata laluan anda dan log masuk anda ke tapak secara automatik pada peranti ini.</translation>
 <translation id="6954850746343724854">Dayakan Klien Asli untuk semua aplikasi web, walaupun yang bukan dipasang daripada Kedai Web Chrome.</translation>
 <translation id="6955446738988643816">Semak Pop Timbul</translation>
 <translation id="695755122858488207">Butang radio tidak dipilih</translation>
@@ -4190,6 +4214,7 @@
         dikonfigurasi dengan betul.</translation>
 <translation id="7014174261166285193">Gagal pemasangan.</translation>
 <translation id="7015226785571892184">Aplikasi berikut akan dilancarkan jika anda menerima permintaan ini: <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Penggandingan Weave digunakan oleh Apl Weave untuk komunikasi selamat dengan peranti pada rangkaian setempat.</translation>
 <translation id="7017004637493394352">Sebut "Ok Google" sekali lagi</translation>
 <translation id="7017219178341817193">Tambah halaman baharu</translation>
 <translation id="7017354871202642555">Tidak dapat menetapkan mod selepas tetingkap ditetapkan.</translation>
@@ -4525,6 +4550,7 @@
 <translation id="7503191893372251637">Jenis Sijil Netscape</translation>
 <translation id="7503821294401948377">Tidak dapat memuatkan ikon '<ph name="ICON" />' untuk tindakan penyemak imbas.</translation>
 <translation id="750413812607578381">Anda perlu memulakan semula <ph name="PRODUCT_NAME" /> sekarang.</translation>
+<translation id="7504483980780085481">Tapak ini membekalkan maklumat Ketelusan Sijil yang tidak sah.</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> ingin:</translation>
 <translation id="750509436279396091">Buka folder muat turun</translation>
 <translation id="7505167922889582512">Tunjukkan fail tersembunyi</translation>
@@ -4680,6 +4706,7 @@
 <translation id="7717536746040464035">Dayakan kotak pasir pemapar seccomp-bpf</translation>
 <translation id="7719421816612904796">Latihan tamat masa</translation>
 <translation id="771953673318695590">S&amp;J</translation>
+<translation id="7721392263035281016">Sambungan selamat tidak boleh diwujudkan kerana tapak ini menggunakan protokol yang tidak disokong atau suit sifer. Biasanya, punca hal ini berlaku ialah apabila pelayan memerlukan sokongan RC4 yang telah dialih keluar.</translation>
 <translation id="7724603315864178912">Potong</translation>
 <translation id="7730449930968088409">Abadikan kandungan skrin anda</translation>
 <translation id="7730494089396812859">Tunjukkan butiran sandaran Awan</translation>
@@ -4780,6 +4807,7 @@
 <translation id="7864539943188674973">Lumpuhkan Bluetooth</translation>
 <translation id="7870790288828963061">Tiada apl Kiosk dengan versi lebih baharu dijumpai. Tiada apa-apa untuk dikemas kini. Sila alih keluar batang USB.</translation>
 <translation id="787150342916295244">Pengimbasan kad kredit</translation>
+<translation id="7874357055309047713">Sentiasa jalankan pada semua tapak</translation>
 <translation id="7876243839304621966">Buangkan semua</translation>
 <translation id="7877451762676714207">Ralat pelayan tidak diketahui. Sila cuba lagi atau hubungi pentadbir pelayan.</translation>
 <translation id="7878999881405658917">Google telah menghantar pemberitahuan ke telefon ini. Harap maklum bahawa dengan Bluetooth, telefon anda boleh terus membuka kunci <ph name="DEVICE_TYPE" /> dari jarak lebih 100 kaki. Sekiranya perkara ini boleh mendatangkan masalah, anda boleh &lt;a&gt;melumpuhkan ciri ini buat sementara waktu&lt;/a&gt;.</translation>
@@ -4819,6 +4847,7 @@
 <translation id="7918257978052780342">Daftar</translation>
 <translation id="7920092496846849526">Anda telah bertanya kepada ibu bapa anda sama ada ok untuk melawat halaman ini.</translation>
 <translation id="7925285046818567682">Menunggu untuk <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> ingat kata laluan anda dan log masuk anda ke apl dan tapak secara automatik pada pelbagai peranti.</translation>
 <translation id="7925686952655276919">Jangan gunakan data mudah alih untuk penyegerakan</translation>
 <translation id="7926906273904422255">Tandai asal tidak selamat sebagai tidak selamat atau sebagai "meragukan".</translation>
 <translation id="7928710562641958568">Keluarkan peranti</translation>
@@ -5006,6 +5035,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">halaman</translation>
 <translation id="8180786512391440389">"<ph name="EXTENSION" />" boleh membaca dan memadamkan fail imej, video dan bunyi di lokasi yang ditandai.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{tiada}=1{1 item}other{# item}}</translation>
 <translation id="8184538546369750125">Gunakan lalai global (Benarkan)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> - Pemilik</translation>
 <translation id="8185331656081929126">Paparkan pemberitahuan apabila pencetak baharu dikesan pada rangkaian</translation>
@@ -5071,6 +5101,7 @@
 <translation id="8263231521757761563">Pengendali protokol aktif</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> telah melumpuhkan kursor tetikus anda.</translation>
 <translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" mencetuskan skrin penuh.</translation>
+<translation id="8267698848189296333">Log masuk sebagai <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Urus sambungan anda dengan mengklik Sambungan dalam menu "Lagi alat".</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> kini dalam skrin penuh dan mahu melumpuhkan kursor tetikus anda.</translation>
 <translation id="8275038454117074363">Import</translation>
@@ -5186,6 +5217,8 @@
 <translation id="8435334418765210033">Rangkaian yang diingati</translation>
 <translation id="8437209419043462667">AS</translation>
 <translation id="843730695811085446">Mendayakan bingkai gaya apl web untuk apl dihoskan, termasuk apl penanda halaman. Pada masa ini iahanya tersedia untuk Ash.</translation>
+<translation id="8437331208797669910">Akses halaman</translation>
+<translation id="843760761634048214">Simpan kad kredit</translation>
 <translation id="8438601631816548197">Perihal Carian Suara</translation>
 <translation id="8439506636278576865">Tawaran untuk menterjemahkan halaman dalam bahasa ini</translation>
 <translation id="8442065444327205563">Dokumen anda telah sedia untuk dilihat.</translation>
@@ -5614,6 +5647,7 @@
 <translation id="9039890312082871605">Redam Beberapa Tab</translation>
 <translation id="9040185888511745258">Penyerang pada <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin mencuba untuk menipu anda untuk memasang atur cara yang membahayakan pengalaman penyemak imbas anda (contohnya, dengan menukar halaman utama anda atau menunjukkan iklan tambahan pada laman yang anda lawati).</translation>
 <translation id="9040421302519041149">Akses ke rangkaian ini dilindungi.</translation>
+<translation id="9040967476106479091">Pilih akaun anda daripada <ph name="PASSWORD_MANAGER_BRAND" /> untuk log masuk</translation>
 <translation id="9041603713188951722">Tunjukkan tetapan dalam tetingkap</translation>
 <translation id="904451693890288097">Sila masukkan kekunci laluan untuk "<ph name="DEVICE_NAME" />":</translation>
 <translation id="904949795138183864">Halaman web di <ph name="URL" /> tidak lagi wujud.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 01b991c..6be8fc5 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -3722,7 +3722,6 @@
 <translation id="6333834492048057036">Focus op adresbalk voor zoeken</translation>
 <translation id="6339034549827494595">Fonetisch Russisch toetsenbord (AATSEEL)</translation>
 <translation id="6341850831632289108">Je fysieke locatie detecteren</translation>
-<translation id="6342069812937806050">Zojuist</translation>
 <translation id="634208815998129842">Taakbeheer</translation>
 <translation id="6344170822609224263">Toegang tot lijst met netwerkverbindingen</translation>
 <translation id="6344783595350022745">Tekst wissen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 0974d80..10bf6c4 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3709,7 +3709,6 @@
 <translation id="6333834492048057036">Fokusér på adressefeltet for søk</translation>
 <translation id="6339034549827494595">Russisk fonetisk (AATSEEL) tastatur</translation>
 <translation id="6341850831632289108">Oppdaging av den fysiske plasseringen din</translation>
-<translation id="6342069812937806050">Akkurat nå</translation>
 <translation id="634208815998129842">Oppgavebehandling</translation>
 <translation id="6344170822609224263">få tilgang til liste over nettverkstilkoblinger</translation>
 <translation id="6344783595350022745">Klar tekst</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 2e99a85..5593ce8 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3715,7 +3715,6 @@
 <translation id="6333834492048057036">Ustaw fokus na pasku adresu, by przeprowadzić wyszukiwanie</translation>
 <translation id="6339034549827494595">Klawiatura rosyjska – fonetyczna (AATSEEL)</translation>
 <translation id="6341850831632289108">Wykrywać Twoją lokalizację fizyczną</translation>
-<translation id="6342069812937806050">Przed momentem</translation>
 <translation id="634208815998129842">Menedżer zadań</translation>
 <translation id="6344170822609224263">Lista dostępu połączeń sieciowych</translation>
 <translation id="6344783595350022745">Wyczyść tekst</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 6b7d0766..1e472e4 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -3715,7 +3715,6 @@
 <translation id="6333834492048057036">Foco na barra de endereço para pesquisa</translation>
 <translation id="6339034549827494595">Teclado fonético russo (AATSEEL)</translation>
 <translation id="6341850831632289108">Detectar sua localização física</translation>
-<translation id="6342069812937806050">Neste instante</translation>
 <translation id="634208815998129842">Gerenciador de tarefas</translation>
 <translation id="6344170822609224263">Acessar lista de conexões de rede</translation>
 <translation id="6344783595350022745">Limpar texto</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 82fc3a6..8ccfabd 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -3724,7 +3724,6 @@
 <translation id="6333834492048057036">Focar barra de endereço para pesquisa</translation>
 <translation id="6339034549827494595">Teclado com a fonética russa (AATSEEL)</translation>
 <translation id="6341850831632289108">Detetar a sua localização física</translation>
-<translation id="6342069812937806050">Mesmo agora</translation>
 <translation id="634208815998129842">Gestor de tarefas</translation>
 <translation id="6344170822609224263">Lista de acesso de ligações de rede</translation>
 <translation id="6344783595350022745">Limpar Texto</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 075b0c89..abf10f62 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -3731,7 +3731,6 @@
 <translation id="6333834492048057036">Focalizează pe bara de adrese pentru căutare</translation>
 <translation id="6339034549827494595">Tastatură rusă fonetică (AATSEEL)</translation>
 <translation id="6341850831632289108">Detectează locația dvs. fizică</translation>
-<translation id="6342069812937806050">Adineauri</translation>
 <translation id="634208815998129842">Manager de activități</translation>
 <translation id="6344170822609224263">Accesează lista conexiunilor de rețea</translation>
 <translation id="6344783595350022745">Ștergeți textul</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index ebbe6a3..49362f3 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3715,7 +3715,6 @@
 <translation id="6333834492048057036">Ввод поискового запроса в адресной строке</translation>
 <translation id="6339034549827494595">Русская раскладка (фонетическая – AATSEEL)</translation>
 <translation id="6341850831632289108">Определение вашего местоположения</translation>
-<translation id="6342069812937806050">только что</translation>
 <translation id="634208815998129842">Диспетчер задач</translation>
 <translation id="6344170822609224263">Доступ к списку сетевых подключений</translation>
 <translation id="6344783595350022745">Очистить</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 837eb0cc..1ac14c0 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Nastaviť automatické aktualizácie pre všetkých používateľov</translation>
 <translation id="1079766198702302550">Vždy blokovať prístup ku kamere</translation>
+<translation id="1082398631555931481">Nástroj <ph name="THIRD_PARTY_TOOL_NAME" /> chce obnoviť vaše nastavenia prehliadača Chrome na predvolené hodnoty. Týmto sa obnoví domovská stránka, stránka na novej karte a vyhľadávač, zakážu sa rozšírenia a uvoľnia všetky karty. Vymažú sa tiež ďalšie dočasné údaje a údaje vyrovnávacej pamäte, ako sú napríklad súbory cookie či údaje obsahu a stránok.</translation>
 <translation id="108346963417674655">So serverom sa nepodarilo nadviazať zabezpečené pripojenie. Tieto webové stránky mohli v minulosti fungovať, vyskytol sa však problém so serverom. Pripojenie k takýmto stránkam predstavuje bezpečnostné riziko pre všetkých používateľov, a bolo preto zakázané.</translation>
 <translation id="1084538181352409184">Skontrolujte nastavenia servera proxy alebo kontaktujte správcu siete
           a požiadajte ho, aby skontroloval, či server proxy funguje.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">Katalánčina</translation>
 <translation id="1156185823432343624">Hlasitosť: stlmená</translation>
 <translation id="1156689104822061371">Rozloženie klávesnice:</translation>
+<translation id="1158274711289833876">Pripojenie zabezpečené protokolom TLS</translation>
 <translation id="1160536908808547677">Pri priblíženom zobrazení sa k tejto zobrazenej oblasti pripoja prvky s pevným umiestnením a panely posúvania s prispôsobenou veľkosťou.</translation>
 <translation id="1161575384898972166">Ak chcete exportovať certifikát klienta, prihláste sa do <ph name="TOKEN_NAME" />.</translation>
 <translation id="1162223735669141505">Ak chcete použiť túto funkciu, musíte povoliť <ph name="BEGIN_LINK" />doplnok Native Client<ph name="END_LINK" /></translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">Povoliť funkcie zjednodušenia prístupu na jednoduchšie používanie zariadenia.</translation>
 <translation id="1190144681599273207">Načítanie tohto súboru spotrebuje približne <ph name="FILE_SIZE" /> mobilných dát.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Pristupujte k súboru uloženému vo vašom počítači}few{Pristupujte k # súborom uloženým vo vašom počítači}many{Pristupujte k # súboru uloženému vo vašom počítači}other{Pristupujte k # súborom uloženým vo vašom počítači}}</translation>
+<translation id="1190855992966397019">Aktivácia uzamknutia kontajnera AppContainer</translation>
 <translation id="1195447618553298278">Neznáma chyba.</translation>
 <translation id="1196338895211115272">Exportovanie súkromného kľúča zlyhalo.</translation>
 <translation id="1196789802623400962">Povolenie/zakázanie možnosti úpravy gest na stránke s nastaveniami virtuálnej klávesnice</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="123578888592755962">Disk je plný</translation>
 <translation id="1240892293903523606">Inšpektor DOM</translation>
+<translation id="1242633766021457174">Nástroj <ph name="THIRD_PARTY_TOOL_NAME" /> chce resetovať vaše nastavenia.</translation>
 <translation id="1243314992276662751">Nahrať</translation>
 <translation id="1244303850296295656">Chyba rozšírenia</translation>
 <translation id="1248269069727746712">Aplikácia <ph name="PRODUCT_NAME" /> používa na pripojenie k sieti systémové nastavenia servera proxy v zariadení.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">Prebieha odstraňovanie...</translation>
 <translation id="1339266338863469628">Predvolené (zaznamenávať iba vás)</translation>
 <translation id="1340527397989195812">Zálohovať médiá zo zariadenia pomocou aplikácie Súbory</translation>
+<translation id="1341988552785875222">Aktuálnu tapetu nastavila aplikácia <ph name="APP_NAME" />. Je možné, že pred výberom inej tapety bude nutné aplikáciu <ph name="APP_NAME" /> odinštalovať.</translation>
 <translation id="1343517687228689568">Uvoľniť túto stránku z Úvodnej obrazovky...</translation>
 <translation id="1344519653668879001">Zakázať kontrolu hypertextových odkazov</translation>
 <translation id="1346104802985271895">Vietnamská metóda vstupu (TELEX)</translation>
@@ -988,6 +993,7 @@
 <translation id="2421956571193030337">Túto funkciu používajte iba s dôveryhodnými účtami.</translation>
 <translation id="2422426094670600218">&lt;bez názvu&gt;</translation>
 <translation id="2423578206845792524">Uložiť &amp;obrázok ako...</translation>
+<translation id="2424091190911472304">Vždy spustiť na webe <ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">Pridajte parameter dopytu do webovej adresy na automatické obnovenie stránky: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Vzhľad</translation>
 <translation id="2433728760128592593">Stlačením klávesov Alt+Shift môžete prepínať medzi metódami vstupu.</translation>
@@ -1307,6 +1313,7 @@
 <translation id="2841837950101800123">Poskytovateľ</translation>
 <translation id="2843055980807544929">Ak je tento príznak zakázaný, Chrome bude udalosti WM_KEY* a WM_CHAR spracovávať samostatne.</translation>
 <translation id="2843806747483486897">Zmeniť predvolenú akciu...</translation>
+<translation id="2844111009524261443">Spustiť po kliknutí</translation>
 <translation id="2845382757467349449">Vždy zobraziť panel so záložkami</translation>
 <translation id="2846816712032308263">Povoliť rýchle zatváranie kariet alebo okien – táto možnosť spustí ovládač karty onunload v jazyku JavaScript nezávisle od hlavného používateľského rozhrania.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1381,6 +1388,7 @@
 <translation id="2937174152333875430">Povoliť synchronizáciu Spúšťača aplikácií</translation>
 <translation id="2938225289965773019">Otvárať odkazy protokolu <ph name="PROTOCOL" /></translation>
 <translation id="2938685643439809023">Mongolčina</translation>
+<translation id="2941479658084239256">Povolí miestne ukladanie stránok na použitie offline.</translation>
 <translation id="2942290791863759244">Nemecká klávesnica NEO 2</translation>
 <translation id="2943400156390503548">Prezentácie</translation>
 <translation id="2946119680249604491">Pridať pripojenie</translation>
@@ -1402,6 +1410,7 @@
 <translation id="2966598748518102999">Zlepšite hlasové vyhľadávanie odoslaním záznamu vyslovenia slov „Ok Google“ a niekoľkých sekúnd predtým spoločnosti Google.</translation>
 <translation id="2967544384642772068">Ukončiť</translation>
 <translation id="2968792643335932010">Menej kópií</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">znížiť jas</translation>
 <translation id="2972557485845626008">Firmvér</translation>
 <translation id="2972581237482394796">&amp;Dopredu</translation>
@@ -1464,6 +1473,7 @@
 <translation id="3064388234319122767">Prepis (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Spätná väzba týkajúca sa vynútene ukončenej karty</translation>
 <translation id="3065140616557457172">Zadajte text na vyhľadávanie alebo webovú adresu – funguje všetko.</translation>
+<translation id="3065351588762546748">Pripojenie k tomuto webu používa silnú verziu protokolu a šifrovacej súpravy.</translation>
 <translation id="3067198360141518313">Spustiť tento doplnok</translation>
 <translation id="3075239840551149663">Vytvoril sa nový kontrolovaný používateľ <ph name="NEW_PROFILE_NAME" />.</translation>
 <translation id="3075874217500066906">Spustenie procesu úplného obnovenia (Powerwash) vyžaduje reštartovanie. Po reštartovaní budete musieť potvrdiť, že chcete pokračovať.</translation>
@@ -1643,6 +1653,7 @@
 <translation id="3308006649705061278">Organizačná jednotka (OU)</translation>
 <translation id="3308116878371095290">Tejto stránke bolo zabránené nastaviť súbory cookie.</translation>
 <translation id="3308134619352333507">Skryť tlačidlo</translation>
+<translation id="3309747692199697901">Vždy spustiť na všetkých stránkach</translation>
 <translation id="3313590242757056087">Ak chcete nastaviť, ktoré stránky môže kontrolovaný používateľ zobraziť, môžete na stránke <ph name="MANAGEMENT_URL" /> nakonfigurovať
     obmedzenia a nastavenia.
     Ak nezmeníte predvolené nastavenia, používateľ <ph name="USER_DISPLAY_NAME" />
@@ -1722,6 +1733,7 @@
 <translation id="3423858849633684918">Reštartujte <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Zadajte počet rastrových vlákien.</translation>
 <translation id="3428010780253032925">Zakázať zacielenie prostredníctvom plochy v tvare obdĺžnika v zobrazeniach</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{aspoň jedna položka v synchronizovaných zariadeniach}=1{1 položka (a ďalšie v synchronizovaných zariadeniach)}few{# položky (a ďalšie v synchronizovaných zariadeniach)}many{# položky (a ďalšie v synchronizovaných zariadeniach)}other{# položiek (a ďalšie v synchronizovaných zariadeniach)}}</translation>
 <translation id="3429599832623003132">počet položiek: $1</translation>
 <translation id="3433621910545056227">Ojoj! Systému sa nepodarilo nastaviť zámku pre inštaláciu atribútov v zariadení.</translation>
 <translation id="343467364461911375">Niektoré obsahové služby používajú identifikátory prístroja na vašu jedinečnú identifikáciu s cieľom autorizácie prístupu ku chránenému obsahu.</translation>
@@ -2002,6 +2014,7 @@
 <translation id="3759933321830434300">Blokovať časti webových stránok</translation>
 <translation id="3760460896538743390">Skontrolovať &amp;stránku na pozadí</translation>
 <translation id="37613671848467444">Otvoriť v &amp;okne inkognito</translation>
+<translation id="3763401818161139108">Vždy spustiť na webe <ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunikujte so zariadením USB}few{Komunikujte s # zariadeniami USB}many{Komunikujte s # zariadením USB}other{Komunikujte s # zariadeniami USB}}</translation>
 <translation id="3764800135428056022">Ponúkať uloženie hesiel webových stránok.</translation>
 <translation id="3764986667044728669">Registrácia zlyhala</translation>
@@ -2226,6 +2239,7 @@
 <translation id="409579654357498729">Pridať do služby Cloud Print</translation>
 <translation id="4096508467498758490">Zakázanie rozšírení spustených v režime vývojára</translation>
 <translation id="4098354747657067197">Nasledujúce stránky sú klamlivé</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{žiadne}=1{1}few{#}many{#}other{#}}</translation>
 <translation id="409980434320521454">Synchronizácia zlyhala</translation>
 <translation id="4103763322291513355">Na stránke &lt;strong&gt;chrome://policy&lt;/strong&gt; nájdete zoznam zakázaných webových adries a ďalšie pravidlá vynútené vaším správcom systému.</translation>
 <translation id="4104163789986725820">E&amp;xportovať...</translation>
@@ -2439,6 +2453,7 @@
 <translation id="4439318412377770121">Chcete zariadenie <ph name="DEVICE_NAME" /> zaregistrovať v službe Google Cloud Devices?</translation>
 <translation id="4441124369922430666">Chcete automaticky spustiť túto aplikáciu po zapnutí zariadenia?</translation>
 <translation id="444134486829715816">Rozbaliť...</translation>
+<translation id="4442309605992420742">Povoliť párovanie pomocou protokolu Weave</translation>
 <translation id="444267095790823769">Výnimky chráneného obsahu</translation>
 <translation id="4443536555189480885">&amp;Pomocník</translation>
 <translation id="4444304522807523469">Mať prístup ku skenerom dokumentov pripojeným cez USB alebo v miestnej sieti</translation>
@@ -2500,6 +2515,7 @@
 <translation id="4545759655004063573">Uloženie nie je možné z dôvodu nedostatočných oprávnení. Uložte položku inde.</translation>
 <translation id="4547659257713117923">Žiadne karty z iných zariadení</translation>
 <translation id="4547992677060857254">Vybratý priečinok obsahuje citlivé súbory. Naozaj chcete aplikácii $1 povoliť trvalý prístup na zapisovanie pre tento priečinok?</translation>
+<translation id="4552495056028768700">Prístup k stránke</translation>
 <translation id="4552678318981539154">Kúpiť väčší ukladací priestor</translation>
 <translation id="4554591392113183336">Verzia externého rozšírenia je rovnaká alebo nižšia ako existujúca verzia</translation>
 <translation id="4554796861933393312">Rýchlosť animácie vzhľadu Material Design Ink Drop</translation>
@@ -2768,6 +2784,7 @@
 <translation id="4920887663447894854">Tieto webové stránky majú zablokované sledovanie vašej polohy na tejto stránke:</translation>
 <translation id="492322146001920322">Konzervatívna stratégia uvoľnenia zaťaženia pamäte</translation>
 <translation id="4923279099980110923">Áno, chcem pomôcť</translation>
+<translation id="4924202073934898868">Povoľuje používanie kontajneru AppContainer pre procesy v karanténe na zlepšenie zabezpečenia.</translation>
 <translation id="4924638091161556692">Pevné</translation>
 <translation id="4925542575807923399">Správca tohto účtu vyžaduje, aby sa tento účet v relácii viacnásobného prihlásenia prihlásil ako prvý.</translation>
 <translation id="4927301649992043040">Zbaliť rozšírenie</translation>
@@ -3283,6 +3300,7 @@
 <translation id="5662457369790254286">Umožňuje konfiguráciu animácie pre panel priebehu načítavania stránky v telefóne s Androidom.</translation>
 <translation id="5663459693447872156">Automaticky prepnúť na polovičnú šírku</translation>
 <translation id="5669267381087807207">Prebieha aktivácia</translation>
+<translation id="5669462439438204699">Uloženie kreditnej karty</translation>
 <translation id="5671961047338275645">Správa webových stránok</translation>
 <translation id="5673305876422468017">Povoliť kontextové okno na rozlíšenie odkazov.</translation>
 <translation id="5676267133227121599">Pristupujte k svojim heslám z ľubovoľného zariadenia na stránke <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3477,6 +3495,7 @@
 <translation id="5941343993301164315">Prihláste sa do <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimalizovať</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Zakáže začiarkavacie políčko na zjednodušenie stránky v dialógovom okne ukážky tlače</translation>
 <translation id="5945992478690277605">Povoliť priblíženie virtuálnej zobrazenej oblasti</translation>
 <translation id="5946591249682680882">ID prehľadu <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Pridať súkromnú sieť</translation>
@@ -3578,11 +3597,14 @@
         Ak tento problém pretrváva, skúste vymazať vyrovnávaciu pamäť. Tento problém môže
         byť v niektorých prípadoch počiatočným prejavom zlyhania hardvéru.</translation>
 <translation id="6084983096586510630">Iba pripojenia prvej strany</translation>
+<translation id="6086814797483779854">Spustiť po kliknutí</translation>
 <translation id="6086846494333236931">Nainštalované vaším správcom</translation>
+<translation id="6088898411501370207">Klient a server nepodporujú spoločnú verziu protokolu SSL ani šifrovaciu súpravu. Obvykle táto situácia nastane, keď server vyžaduje podporu šifrovacieho algoritmu RC4, ktorá bola odstránená.</translation>
 <translation id="6089481419520884864">Destilovať stránku</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Vaša karta je overená</translation>
 <translation id="6093888419484831006">Zrušenie aktualizácie...</translation>
+<translation id="6094826672794738469">Alternatívne služby</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Otvoriť maximalizované</translation>
 <translation id="6096326118418049043">Názov X.500</translation>
@@ -3729,7 +3751,6 @@
 <translation id="6333834492048057036">Zamerať na panel s adresou za účelom vyhľadávania</translation>
 <translation id="6339034549827494595">Ruská fonetická (AATSEEL) klávesnica</translation>
 <translation id="6341850831632289108">Určiť vašu fyzickú polohu</translation>
-<translation id="6342069812937806050">Práve teraz</translation>
 <translation id="634208815998129842">Správca úloh</translation>
 <translation id="6344170822609224263">Pristupovať k zoznamu sieťových pripojení</translation>
 <translation id="6344783595350022745">Prehľadný text</translation>
@@ -3779,6 +3800,7 @@
 <translation id="6417515091412812850">Nie je možné skontrolovať, či bol certifikát odmietnutý.</translation>
 <translation id="6418160186546245112">Prebieha vrátenie späť na predchádzajúcu nainštalovanú verziu produktu <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">Natrvalo odstrániť prístup pre všetky aplikácie</translation>
+<translation id="6419708387665252597">Deaktivovať zjednodušenie stránky v ukážke tlače</translation>
 <translation id="6419902127459849040">Stredoeurópske</translation>
 <translation id="6420676428473580225">Pridať na plochu</translation>
 <translation id="6422329785618833949">Fotka bola zrkadlovo obrátená</translation>
@@ -3909,6 +3931,7 @@
 <translation id="6588399906604251380">Povoliť kontrolu pravopisu</translation>
 <translation id="6589706261477377614">Zvýšiť jas klávesov</translation>
 <translation id="6592267180249644460">Denník WebRTC zaznamenaný <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">menej ako <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">najlepšie</translation>
 <translation id="6596092346130528198">Je toto stránka na novej karte, ktorú ste čakali?</translation>
 <translation id="6596325263575161958">Možnosti šifrovania</translation>
@@ -4126,6 +4149,7 @@
 <translation id="6948736568813450284">Pre vývojárov: Použite službu karantény pre volania prostredníctvom rozhrania Google Payments API.</translation>
 <translation id="6949306908218145636">Pridať otvorené stránky medzi záložky...</translation>
 <translation id="695164542422037736">Ak je táto možnosť povolená a ak je hlavná časť štylizovaná s pevne fixovaným pozadím, bude mať pozadie vlastnú zloženú vrstvu.</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> si pamätá vaše heslá a automaticky vás v tomto zariadení prihlasuje na weby.</translation>
 <translation id="6954850746343724854">Povoliť technológiu Native client pre všetky webové aplikácie (aj tie, ktoré nie sú nainštalované z Internetového obchodu Chrome).</translation>
 <translation id="6955446738988643816">Preskúmať kontextové okná</translation>
 <translation id="695755122858488207">Nevybratý prepínač</translation>
@@ -4182,6 +4206,7 @@
 <translation id="7015226785571892184">Ak túto žiadosť prijmete, spustí sa nasledovná aplikácia:
 
 <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Párovanie pomocou protokolu Weave používa aplikácia Weave na zabezpečenú komunikáciu so zariadeniami v miestnej sieti.</translation>
 <translation id="7017004637493394352">Vyslovte „Ok Google“ ešte raz</translation>
 <translation id="7017219178341817193">Pridať novú stránku</translation>
 <translation id="7017354871202642555">Po nastavení okna nie je možné nastaviť režim.</translation>
@@ -4513,6 +4538,7 @@
 <translation id="7503191893372251637">Netscape – typ certifikátu </translation>
 <translation id="7503821294401948377">Nepodarilo sa načítať ikonu „<ph name="ICON" />“ akcie prehliadača.</translation>
 <translation id="750413812607578381">Prehliadač <ph name="PRODUCT_NAME" /> by ste mali teraz reštartovať.</translation>
+<translation id="7504483980780085481">Tento web poskytol neplatné informácie o transparentnosti certifikátu.</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> vyžaduje:</translation>
 <translation id="750509436279396091">Otvoriť priečinok stiahnutých súborov</translation>
 <translation id="7505167922889582512">Zobraziť skryté súbory</translation>
@@ -4666,6 +4692,7 @@
 <translation id="7717536746040464035">Povoliť karanténu vykresľovacieho modulu seccomp-bpf</translation>
 <translation id="7719421816612904796">Časový limit cvičenia vypršal</translation>
 <translation id="771953673318695590">Kontrola kvality</translation>
+<translation id="7721392263035281016">Nie je možné nadviazať zabezpečené pripojenie, pretože tieto stránky používajú nepodporovaný protokol alebo šifrovaciu súpravu. Obvykle táto situácia nastane, keď server vyžaduje podporu šifrovacieho algoritmu RC4, ktorá bola odstránená.</translation>
 <translation id="7724603315864178912">Vystrihnúť</translation>
 <translation id="7730449930968088409">Zachytiť obsah obrazovky</translation>
 <translation id="7730494089396812859">Zobraziť podrobnosti zálohy v cloude</translation>
@@ -4766,6 +4793,7 @@
 <translation id="7864539943188674973">Zakázať rozhranie Bluetooth</translation>
 <translation id="7870790288828963061">Nenašli sa žiadne aplikácie Kiosku s novšou verziou. Nie je čo aktualizovať. Odoberte kľúč USB.</translation>
 <translation id="787150342916295244">Skenovanie kreditných kariet</translation>
+<translation id="7874357055309047713">Vždy spustiť na všetkých stránkach</translation>
 <translation id="7876243839304621966">Odstrániť všetko</translation>
 <translation id="7877451762676714207">Neznáma chyba servera. Skúste to znova alebo sa obráťte na správcu servera.</translation>
 <translation id="7878999881405658917">Google odoslal na tento telefón upozornenie. Vďaka pripojeniu Bluetooth dokáže váš telefón ponechať zariadenie <ph name="DEVICE_TYPE" /> odomknuté až do vzdialenosti 10 metrov. V nevhodných prípadoch môžete &lt;a&gt;túto funkciu dočasne zakázať&lt;/a&gt;.</translation>
@@ -4805,6 +4833,7 @@
 <translation id="7918257978052780342">Zaregistrovať</translation>
 <translation id="7920092496846849526">Opýtali ste sa svojho rodiča, či môžete navštíviť túto stránku.</translation>
 <translation id="7925285046818567682">Čakanie na <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> si pamätá vaše heslá a automaticky vás v zariadeniach prihlasuje do aplikácií na weby.</translation>
 <translation id="7925686952655276919">Nepoužívať mobilné dátové prenosy na synchronizáciu</translation>
 <translation id="7926906273904422255">Označiť nezabezpečené zdroje ako Nezabezpečené alebo Pochybné.</translation>
 <translation id="7928710562641958568">Vysunúť zariadenie</translation>
@@ -4990,6 +5019,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">strana</translation>
 <translation id="8180786512391440389">Rozšírenie <ph name="EXTENSION" /> dokáže čítať a odstrániť obrázky, videá a zvukové súbory vo vybratých umiestneniach.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{žiadne}=1{1 položka}few{# položky}many{# položky}other{# položiek}}</translation>
 <translation id="8184538546369750125">Použiť predvolené všeobecné nastavenie (Povoliť)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> – vlastník</translation>
 <translation id="8185331656081929126">Zobrazovať upozornenia, keď sa v sieti zistia nové tlačiarne</translation>
@@ -5055,6 +5085,7 @@
 <translation id="8263231521757761563">Aktívne obslužné programy protokolov</translation>
 <translation id="8263744495942430914">Stránka <ph name="FULLSCREEN_ORIGIN" /> zakázala kurzor myši.</translation>
 <translation id="8264718194193514834">Rozšírenie <ph name="EXTENSION_NAME" /> spustilo režim celej obrazovky.</translation>
+<translation id="8267698848189296333">Prihlasovanie pomocou účtu <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Ak chcete spravovať rozšírenia, kliknite v ponuke Ďalšie nástroje na možnosť Rozšírenia.</translation>
 <translation id="8273972836055206582">Stránka <ph name="FULLSCREEN_ORIGIN" /> je teraz zobrazená na celú obrazovku a chce zakázať kurzor myši.</translation>
 <translation id="8275038454117074363">Importovať</translation>
@@ -5169,6 +5200,8 @@
 <translation id="8435334418765210033">Zapamätané siete</translation>
 <translation id="8437209419043462667">Americká klávesnica</translation>
 <translation id="843730695811085446">Aktivuje pre hostené aplikácie (vrátane záložkových aplikácií) rámec v štýle webových aplikácií. V súčasnosti je táto funkcia k dispozícii iba pre správcu okien Ash.</translation>
+<translation id="8437331208797669910">Prístup k stránke</translation>
+<translation id="843760761634048214">Uloženie kreditnej karty</translation>
 <translation id="8438601631816548197">Informácie o hlasovom vyhľadávaní</translation>
 <translation id="8439506636278576865">Ponúkať preklady stránok v tomto jazyku</translation>
 <translation id="8442065444327205563">Dokument je pripr. na zobraz.</translation>
@@ -5590,6 +5623,7 @@
 <translation id="9039890312082871605">Stlmiť karty</translation>
 <translation id="9040185888511745258">Útočníci na webe <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> sa vás môžu pokúsiť podvodom presvedčiť, aby ste si nainštalovali programy poškodzujúce vaše prostredie prehliadania (napríklad zmenou vašej domovskej stránky alebo zobrazovaním ďalších reklám na stránkach, ktoré navštevujete).</translation>
 <translation id="9040421302519041149">Prístup k tejto sieti je chránený.</translation>
+<translation id="9040967476106479091">Ak sa chcete prihlásiť, vyberte svoj účet z aplikácie <ph name="PASSWORD_MANAGER_BRAND" /></translation>
 <translation id="9041603713188951722">Zobraziť nastavenia v okne</translation>
 <translation id="904451693890288097">Zadajte prístupový kľúč pre zariadenie „<ph name="DEVICE_NAME" />“:</translation>
 <translation id="904949795138183864">Webová stránka na adrese <ph name="URL" /> už neexistuje.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index bc11c587..cb2d51a 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3728,7 +3728,6 @@
 <translation id="6333834492048057036">Preklop na naslovno vrstico za iskanje</translation>
 <translation id="6339034549827494595">Ruska fonetična (AATSEEL) tipkovnica</translation>
 <translation id="6341850831632289108">Odkrijte svojo fizično lokacijo</translation>
-<translation id="6342069812937806050">Pravkar</translation>
 <translation id="634208815998129842">Upravitelj opravil</translation>
 <translation id="6344170822609224263">Dostop do seznama omrežnih povezav</translation>
 <translation id="6344783595350022745">Izbriši besedilo</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 2bf83c3f..7bfccdf3 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -3727,7 +3727,6 @@
 <translation id="6333834492048057036">Фокус на траци за адресу за претрагу</translation>
 <translation id="6339034549827494595">Руска фонетска тастатура (AATSEEL)</translation>
 <translation id="6341850831632289108">Откривање ваше физичке локације</translation>
-<translation id="6342069812937806050">Малопре</translation>
 <translation id="634208815998129842">Менаџер задатака</translation>
 <translation id="6344170822609224263">Приступ листи мрежних веза</translation>
 <translation id="6344783595350022745">Обриши текст</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 2b384f7..9e64e314 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -60,6 +60,7 @@
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1077946062898560804">Konfigurera automatiska uppdateringar för alla användare</translation>
 <translation id="1079766198702302550">Blockera alltid kameraåtkomsten</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> önskar återställa inställningarna för Chrome till de ursprungliga standardinställningarna. Detta innebär att din startsida tillsammans med sidan ny flik och sökmotorn återställs liksom att tillägg inaktiveras och alla flikar lossas. Dessutom rensas alla tillfälliga och cachelagrade data, såsom cookies, innehåll och webbplatsdata</translation>
 <translation id="108346963417674655">Det gick inte att ansluta säkert till servern. Webbplatsen kan ha fungerat tidigare, men det är problem med servern. Om du ansluter till den här typen av webbplatser försvagas säkerheten för alla användare. Vi har därför inaktiverat webbplatsen.</translation>
 <translation id="1084538181352409184">Kontrollera proxyinställningarna eller kontakta nätverksadministratören om du
           vill kontrollera att proxyservern fungerar.
@@ -117,6 +118,7 @@
 <translation id="1155759005174418845">katalanska</translation>
 <translation id="1156185823432343624">Volym: avstängd</translation>
 <translation id="1156689104822061371">Tangentbordslayout:</translation>
+<translation id="1158274711289833876">Säker TLS-anslutning</translation>
 <translation id="1160536908808547677">I inzoomat tillstånd fästs element med fast placering och skalanpassade rullningslister mot den här rutan.</translation>
 <translation id="1161575384898972166">Logga in på <ph name="TOKEN_NAME" /> om du vill exportera klientcertifikatet.</translation>
 <translation id="1162223735669141505">Du måste aktivera <ph name="BEGIN_LINK" />Native Client-pluginprogrammet<ph name="END_LINK" /> för att kunna använda den här funktionen.</translation>
@@ -144,6 +146,7 @@
 <translation id="1189418886587279221">Aktivera tillgänglighetsfunktioner så att enheten blir lättare att använda.</translation>
 <translation id="1190144681599273207">Att hämta den här filen kräver ungefär <ph name="FILE_SIZE" /> mobildata.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Åtkomst till en fil som sparats på datorn}other{Åtkomst till # filer som sparats på datorn}}</translation>
+<translation id="1190855992966397019">Aktivera låsning av AppContainer.</translation>
 <translation id="1195447618553298278">Okänt fel.</translation>
 <translation id="1196338895211115272">Det gick inte att exportera den privata nyckeln.</translation>
 <translation id="1196789802623400962">Aktivera/inaktivera alternativet att redigera rörelser på inställningssidan för det virtuella tangentbordet.</translation>
@@ -179,6 +182,7 @@
 <translation id="1234808891666923653">ServiceWorker-funktioner</translation>
 <translation id="123578888592755962">Enheten är full</translation>
 <translation id="1240892293903523606">DOM-inspektör</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> önskar återställa dina inställningar.</translation>
 <translation id="1243314992276662751">Ladda upp</translation>
 <translation id="1244303850296295656">Fel i tillägg</translation>
 <translation id="1248269069727746712"><ph name="PRODUCT_NAME" /> använder enhetens proxyinställningar för att ansluta till nätverket.</translation>
@@ -232,6 +236,7 @@
 <translation id="1338950911836659113">Uppgifterna tas bort ...</translation>
 <translation id="1339266338863469628">Standard (ljud bara från ditt håll tas upp)</translation>
 <translation id="1340527397989195812">Säkerhetskopiera media från enheten med appen Filer.</translation>
+<translation id="1341988552785875222">Den aktuella bakgrunden har ställts in av <ph name="APP_NAME" />. Du kan komma att behöva avinstallera <ph name="APP_NAME" /> innan du kan välja en annan bakgrund.</translation>
 <translation id="1343517687228689568">Lossa den här sidan från startskärmen ...</translation>
 <translation id="1344519653668879001">Inaktivera granskning av hyperlänkar</translation>
 <translation id="1346104802985271895">Vietnamesisk inmatningsmetod (TELEX)</translation>
@@ -986,6 +991,7 @@
 <translation id="2421956571193030337">Använd bara den här funktionen med konton som du litar på.</translation>
 <translation id="2422426094670600218">&lt;namnlös&gt;</translation>
 <translation id="2423578206845792524">S&amp;para bild som...</translation>
+<translation id="2424091190911472304">Kör alltid på <ph name="ORIGIN" /></translation>
 <translation id="2433452467737464329">Lägg till en frågeparameter i webbadressen om du vill uppdatera sidan automatiskt: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Utseende</translation>
 <translation id="2433728760128592593">Tryck på Alt + Skift om du vill växla mellan inmatningsmetoder.</translation>
@@ -1305,6 +1311,7 @@
 <translation id="2841837950101800123">Leverantör</translation>
 <translation id="2843055980807544929">När alternativet är inaktiverat hanteras WM_KEY* och WM_CHAR separat av Chrome.</translation>
 <translation id="2843806747483486897">Ändra standard ...</translation>
+<translation id="2844111009524261443">Kör vid klickning</translation>
 <translation id="2845382757467349449">Visa alltid bokmärkesfältet</translation>
 <translation id="2846816712032308263">Aktiverar snabb stängning av flikar/fönster – kör en fliks js-hanterare som inte lästs in oberoende av GUI.</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
@@ -1381,6 +1388,7 @@
 <translation id="2937174152333875430">Aktivera synkronisering av startprogrammet för appar</translation>
 <translation id="2938225289965773019">Öppna <ph name="PROTOCOL" />-länkar</translation>
 <translation id="2938685643439809023">mongoliska</translation>
+<translation id="2941479658084239256">Aktivera lokal lagring av webbsidor för användning offline.</translation>
 <translation id="2942290791863759244">Tyskt Neo 2-tangentbord</translation>
 <translation id="2943400156390503548">Presentationer</translation>
 <translation id="2946119680249604491">Lägg till anslutning</translation>
@@ -1402,6 +1410,7 @@
 <translation id="2966598748518102999">Förbättra röstsökningen genom att skicka ljudet Ok Google och några sekunder innan till Google.</translation>
 <translation id="2967544384642772068">Stäng</translation>
 <translation id="2968792643335932010">Färre kopior</translation>
+<translation id="2971033837577180453">&lt;span&gt;ID:&lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="2971213274238188218">mörkare</translation>
 <translation id="2972557485845626008">Fast programvara</translation>
 <translation id="2972581237482394796">&amp;Upprepa</translation>
@@ -1464,6 +1473,7 @@
 <translation id="3064388234319122767">Translitterering (zdravo → здраво)</translation>
 <translation id="3065041951436100775">Feedback vid stängd flik.</translation>
 <translation id="3065140616557457172">Skriv för att söka eller skriv in en webbadress för att navigera – båda fungerar bra.</translation>
+<translation id="3065351588762546748">En stark protokollversion och krypteringssvit används för anslutningen till den här webbplatsen.</translation>
 <translation id="3067198360141518313">Kör det här plugin-programmet</translation>
 <translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> har skapats som en övervakad användare!</translation>
 <translation id="3075874217500066906">En omstart krävs för att Powerwash-processen ska inledas. Efter omstarten får du bekräfta att du vill fortsätta.</translation>
@@ -1643,6 +1653,7 @@
 <translation id="3308006649705061278">Organisationsenhet (OU)</translation>
 <translation id="3308116878371095290">Den här sidan har förhindrats att ange cookies.</translation>
 <translation id="3308134619352333507">Dölj knapp</translation>
+<translation id="3309747692199697901">Kör alltid på alla webbplatser</translation>
 <translation id="3313590242757056087">Om du vill ange vilka webbplatser som den övervakade användaren får besöka, kan du ange begränsningar
     och inställningar genom att besöka <ph name="MANAGEMENT_URL" />.
     Om du inte ändrar standardinställningarna kan <ph name="USER_DISPLAY_NAME" />
@@ -1722,6 +1733,7 @@
 <translation id="3423858849633684918">Starta om <ph name="PRODUCT_NAME" /></translation>
 <translation id="3426704822745136852">Ange antalet rastertrådar.</translation>
 <translation id="3428010780253032925">Inaktivera rektangelbaserad inriktning i visningar</translation>
+<translation id="3429274334716393946">{COUNT,plural, =0{minst 1 objekt på synkroniserade enheter}=1{1 objekt (och fler på synkroniserade enheter)}other{# objekt (och fler på synkroniserade enheter)}}</translation>
 <translation id="3429599832623003132">$1 objekt</translation>
 <translation id="3433621910545056227">Hoppsan! Det gick inte att fastställa enhetens attributlås för installationstid.</translation>
 <translation id="343467364461911375">Vissa innehållstjänster använder datoridentifierare för att identifiera dig unikt i syfte att ge åtkomst till skyddat innehåll.</translation>
@@ -2002,6 +2014,7 @@
 <translation id="3759933321830434300">Blockera delar av webbsidor</translation>
 <translation id="3760460896538743390">Kontrollera &amp;bakgrundssida</translation>
 <translation id="37613671848467444">Öppna i &amp;inkognitofönster</translation>
+<translation id="3763401818161139108">Kör alltid på <ph name="ORIGIN" /></translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommunicera med en USB-enhet}other{Kommunicera med # USB-enheter}}</translation>
 <translation id="3764800135428056022">Erbjud att spara webblösenord.</translation>
 <translation id="3764986667044728669">Det går inte att registrera</translation>
@@ -2226,6 +2239,7 @@
 <translation id="409579654357498729">Lägg till i Cloud Print</translation>
 <translation id="4096508467498758490">Inaktivera tillägg i utvecklarläge</translation>
 <translation id="4098354747657067197">Webbplatsen som öppnas är bedräglig</translation>
+<translation id="4099585076575543605">{COUNT,plural, =0{inga}=1{1}other{#}}</translation>
 <translation id="409980434320521454">Synkroniseringen misslyckades</translation>
 <translation id="4103763322291513355">Besök &lt;strong&gt;chrome://policy&lt;/strong&gt; om du vill visa listan med webbadresser som inte är godkända och andra policyer som angetts av systemadministratören.</translation>
 <translation id="4104163789986725820">E&amp;xportera...</translation>
@@ -2439,6 +2453,7 @@
 <translation id="4439318412377770121">Vill du registrera <ph name="DEVICE_NAME" /> i Google Cloud Devices?</translation>
 <translation id="4441124369922430666">Vill du starta denna app automatiskt när maskinen slås på?</translation>
 <translation id="444134486829715816">Expandera..</translation>
+<translation id="4442309605992420742">Aktivera Weave-koppling</translation>
 <translation id="444267095790823769">Undantag för skyddat innehåll</translation>
 <translation id="4443536555189480885">&amp;Hjälp</translation>
 <translation id="4444304522807523469">Åtkomst till dokumentskannrar som är anslutna via USB eller i det lokala nätverket</translation>
@@ -2500,6 +2515,7 @@
 <translation id="4545759655004063573">Det gick inte att spara eftersom behörigheten var otillräcklig. Spara på en annan plats.</translation>
 <translation id="4547659257713117923">Inga flikar från andra enheter</translation>
 <translation id="4547992677060857254">Mappen som du valde innehåller känsliga filer. Vill du bevilja $1 permanent skrivåtkomst till den här mappen?</translation>
+<translation id="4552495056028768700">Sidåtkomst</translation>
 <translation id="4552678318981539154">Köp mer lagringsutrymme</translation>
 <translation id="4554591392113183336">Det externa tillägget har samma eller lägre version än det som redan finns.</translation>
 <translation id="4554796861933393312">Animeringshastighet för bläckdroppen i Material Design</translation>
@@ -2769,6 +2785,7 @@
 <translation id="4920887663447894854">Följande webbplatser har förhindrats att spåra din plats på sidan:</translation>
 <translation id="492322146001920322">Försiktig strategi för att minska minnesbelastning</translation>
 <translation id="4923279099980110923">Ja, jag vill hjälpa till</translation>
+<translation id="4924202073934898868">Aktiverar användning av AppContainer vid sandlådeprocesser för ökad säkerhet.</translation>
 <translation id="4924638091161556692">Åtgärdat</translation>
 <translation id="4925542575807923399">Administratören för kontot kräver att kontot är det första i en session med multiinloggning.</translation>
 <translation id="4927301649992043040">Paketera tillägg</translation>
@@ -3284,6 +3301,7 @@
 <translation id="5662457369790254286">Konfigurerar animeringen av förloppsindikatorn för inläsning av sidor på Android-mobiler.</translation>
 <translation id="5663459693447872156">Växla automatiskt till halv bredd</translation>
 <translation id="5669267381087807207">Aktiverar</translation>
+<translation id="5669462439438204699">Spara kreditkort</translation>
 <translation id="5671961047338275645">Hantera webbplatser</translation>
 <translation id="5673305876422468017">Aktivera popupfönster som gör det enklare för användaren att klicka på rätt länk.</translation>
 <translation id="5676267133227121599">Få tillgång till dina lösenord från alla enheter på <ph name="MANAGEMENT_LINK" />.</translation>
@@ -3478,6 +3496,7 @@
 <translation id="5941343993301164315">Logga in på <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimera</translation>
 <translation id="5942207977017515242">https://support.google.com/chrome/?hl=<ph name="GRITLANGCODE_1" />&amp;p=settings_sign_in</translation>
+<translation id="5942307140017356965">Inaktivera kryssrutan för förenkling av sida i förhandsgranskningsdialogen</translation>
 <translation id="5945992478690277605">Aktivera hopdragning av virtuell ruta.</translation>
 <translation id="5946591249682680882">Rapport-id <ph name="WEBRTC_LOG_REPORT_ID" /></translation>
 <translation id="5948544841277865110">Lägg till privat nätverk</translation>
@@ -3579,11 +3598,14 @@
         Om problemet kvarstår kan du försöka med att rensa cacheminnet. I vissa fall
         kan detta också vara ett tecken på att maskinvara håller på att gå sönder.</translation>
 <translation id="6084983096586510630">Endast förstapartsanslutningar</translation>
+<translation id="6086814797483779854">Kör vid klickning</translation>
 <translation id="6086846494333236931">Har installerats av administratören</translation>
+<translation id="6088898411501370207">Klienten och servern har inte stöd för en gemensam SSL-protokollversion eller sifferversion. Detta inträffar oftast när servern behöver stöd för RC4, som har tagits bort.</translation>
 <translation id="6089481419520884864">Skapa Distiller-sida</translation>
 <translation id="6092270396854197260">MSPY</translation>
 <translation id="6093795393556121384">Ditt kort har verifierats</translation>
 <translation id="6093888419484831006">Avbryter uppdatering ...</translation>
+<translation id="6094826672794738469">Alternativa tjänster.</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="6096047740730590436">Öppna maximerad</translation>
 <translation id="6096326118418049043">X.500-namn</translation>
@@ -3730,7 +3752,6 @@
 <translation id="6333834492048057036">Fokusera på adressfältet för sökning</translation>
 <translation id="6339034549827494595">Ryskt fonetiskt tangentbord (AATSEEL)</translation>
 <translation id="6341850831632289108">Identifiera din fysiska plats</translation>
-<translation id="6342069812937806050">Alldeles nyss</translation>
 <translation id="634208815998129842">Aktivitetshanteraren</translation>
 <translation id="6344170822609224263">Få åtkomst till en lista med nätverksanslutningar</translation>
 <translation id="6344783595350022745">Rensa text</translation>
@@ -3780,6 +3801,7 @@
 <translation id="6417515091412812850">Det gick inte att kontrollera om certifikatet har återkallats.</translation>
 <translation id="6418160186546245112">Återgå till den tidigare installerade versionen av <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="6418481728190846787">Ta bort tillgången till alla appar permanent</translation>
+<translation id="6419708387665252597">Inaktivera förenkling av sida vid förhandsgranskning</translation>
 <translation id="6419902127459849040">Centraleuropeiskt</translation>
 <translation id="6420676428473580225">Lägg till på skrivbordet</translation>
 <translation id="6422329785618833949">Fotot har vänts</translation>
@@ -3911,6 +3933,7 @@
 <translation id="6588399906604251380">Aktivera stavningskontroll</translation>
 <translation id="6589706261477377614">Öka tangenternas ljusstyrka</translation>
 <translation id="6592267180249644460">WebRTC-logg registrerades <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
+<translation id="6593753688552673085">mindre än <ph name="UPPER_ESTIMATE" /></translation>
 <translation id="6593868448848741421">bäst</translation>
 <translation id="6596092346130528198">Var det den här nya fliksidan du väntade dig?</translation>
 <translation id="6596325263575161958">Krypteringsalternativ</translation>
@@ -4128,6 +4151,7 @@
 <translation id="6948736568813450284">För utvecklare: använd sandlådetjänsten för anrop med API:et för Google Payments.</translation>
 <translation id="6949306908218145636">Spara bokmärke till öppna sidor …</translation>
 <translation id="695164542422037736">Om det här alternativet är aktiverat och brödtexten har ett format med fast bakgrundsbilaga kommer bakgrunden att ha sitt eget sammansatta lager.</translation>
+<translation id="6952626679169241027"><ph name="PASSWORD_MANAGER_BRAND" /> kommer ihåg lösenord och loggar automatiskt in dig på webbplatser på den här enheten.</translation>
 <translation id="6954850746343724854">Aktivera Native Client för alla webbprogram, även de som inte installerats från Chrome Web Store.</translation>
 <translation id="6955446738988643816">Kontrollera popup</translation>
 <translation id="695755122858488207">Avmarkerad alternativknapp</translation>
@@ -4185,6 +4209,7 @@
         avvisades.  Webbplatsen kanske är nere, eller så är ditt nätverk inte konfigurerat korrekt.</translation>
 <translation id="7014174261166285193">Installationen misslyckades.</translation>
 <translation id="7015226785571892184">Följande program startas om du godtar denna begäran: <ph name="APPLICATION" /></translation>
+<translation id="7016688023264690202">Weave-koppling används av appen Weave för säker kommunikation med enheter i det lokala nätverket.</translation>
 <translation id="7017004637493394352">Säg ”Ok Google” igen</translation>
 <translation id="7017219178341817193">Lägg till ny sida</translation>
 <translation id="7017354871202642555">Det går inte att ange läge när fönstret har skapats.</translation>
@@ -4515,6 +4540,7 @@
 <translation id="7503191893372251637">Certifieringstyp för Netscape</translation>
 <translation id="7503821294401948377">Det gick inte att läsa in ikonen <ph name="ICON" /> för webbläsaråtgärden.</translation>
 <translation id="750413812607578381">Du bör starta om <ph name="PRODUCT_NAME" /> nu.</translation>
+<translation id="7504483980780085481">De certifikattransparensuppgifter som skickades från webbplatsen är ogiltiga.</translation>
 <translation id="7504676042960447229"><ph name="SITE_NAME" /> vill:</translation>
 <translation id="750509436279396091">Öppna mappen för nedladdningar</translation>
 <translation id="7505167922889582512">Visa dolda filer</translation>
@@ -4668,6 +4694,7 @@
 <translation id="7717536746040464035">Aktivera sandlådan seccomp-bpf för rendering</translation>
 <translation id="7719421816612904796">Tidsgräns för utbildning uppnådd</translation>
 <translation id="771953673318695590">Kvalitetssäkring</translation>
+<translation id="7721392263035281016">En säker anslutning kunde inte upprättas eftersom webbplatsen använder sig av ett protokoll eller en krypteringssvit som det saknas stöd för. Detta orsakas vanligen av att servern behöver stöd för RC4 som har tagits bort.</translation>
 <translation id="7724603315864178912">Klipp ut</translation>
 <translation id="7730449930968088409">Ta en bild av innehållet på skärmen</translation>
 <translation id="7730494089396812859">Visa information om säkerhetskopiering i molnet</translation>
@@ -4768,6 +4795,7 @@
 <translation id="7864539943188674973">Inaktivera Bluetooth</translation>
 <translation id="7870790288828963061">Inga kioskappar med nyare version hittades. Det finns inget att uppdatera. Ta bort USB-minnet.</translation>
 <translation id="787150342916295244">Inläsning av kreditkort</translation>
+<translation id="7874357055309047713">Kör alltid på alla webbplatser</translation>
 <translation id="7876243839304621966">Ta bort alla</translation>
 <translation id="7877451762676714207">Okänt serverfel. Försök igen eller kontakta serveradministratören.</translation>
 <translation id="7878999881405658917">Google skickade ett meddelande till den här mobilen. Tänk på att med Bluetooth kan mobilen ha <ph name="DEVICE_TYPE" /> olåst på mer än 30 meters avstånd. I de fall detta kan orsaka ett problem kan du &lt;a&gt;tillfälligt inaktivera funktionen&lt;/a&gt;.</translation>
@@ -4807,6 +4835,7 @@
 <translation id="7918257978052780342">Registrera</translation>
 <translation id="7920092496846849526">Du har frågat en förälder om lov att besöka den här sidan.</translation>
 <translation id="7925285046818567682">Väntar på <ph name="HOST_NAME" />...</translation>
+<translation id="7925425262460550824"><ph name="PASSWORD_MANAGER_BRAND" /> kommer ihåg lösenord och loggar automatiskt in dig på webbplatser och i appar på flera enheter</translation>
 <translation id="7925686952655276919">Använd inte mobildata för synkronisering</translation>
 <translation id="7926906273904422255">Markera osäkra källor som osäkra eller som tvivelaktiga.</translation>
 <translation id="7928710562641958568">Mata ut enhet</translation>
@@ -4992,6 +5021,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8180239481735238521">sida</translation>
 <translation id="8180786512391440389"><ph name="EXTENSION" /> kan läsa och ta bort bilder, video och ljudfiler på de markerade platserna.</translation>
+<translation id="8183368067134675917">{COUNT,plural, =0{inga}=1{1 objekt}other{# objekt}}</translation>
 <translation id="8184538546369750125">Använd global standardinställning (Tillåt)</translation>
 <translation id="818454486170715660"><ph name="NAME" /> – ägare</translation>
 <translation id="8185331656081929126">Visa aviseringar när nya skrivare hittas i nätverket</translation>
@@ -5057,6 +5087,7 @@
 <translation id="8263231521757761563">Aktiva protokollhanterare</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> har inaktiverat muspekaren.</translation>
 <translation id="8264718194193514834"><ph name="EXTENSION_NAME" /> aktiverade helskärmsläge.</translation>
+<translation id="8267698848189296333">Loggar in som <ph name="USERNAME" /></translation>
 <translation id="8272443605911821513">Hantera dina tillägg genom att klicka på Tillägg i menyn Fler verktyg.</translation>
 <translation id="8273972836055206582"><ph name="FULLSCREEN_ORIGIN" /> är nu i helskärmsläge och försöker inaktivera muspekaren.</translation>
 <translation id="8275038454117074363">Importera</translation>
@@ -5170,6 +5201,8 @@
 <translation id="8435334418765210033">Sparade nätverk</translation>
 <translation id="8437209419043462667">USA</translation>
 <translation id="843730695811085446">Aktiverar webbappens formatmall för ramar för appar som du är värd för, bland annat bokmärkesappar. Detta är för närvarande bara tillgängligt för Ash.</translation>
+<translation id="8437331208797669910">Sidåtkomst</translation>
+<translation id="843760761634048214">Spara kreditkort</translation>
 <translation id="8438601631816548197">Om röstsökning</translation>
 <translation id="8439506636278576865">Erbjud att översätta sidor på detta språk</translation>
 <translation id="8442065444327205563">Dokumentet är klart att visas.</translation>
@@ -5591,6 +5624,7 @@
 <translation id="9039890312082871605">Stäng av ljud från flikar</translation>
 <translation id="9040185888511745258">Angripare på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> kan försöka lura dig att installera program som skadar din webbupplevelse (till exempel genom att byta ut din startsida eller visa extra annonser på webbplatser som du besöker).</translation>
 <translation id="9040421302519041149">Åtkomsten till nätverket är begränsad</translation>
+<translation id="9040967476106479091">Välj ditt konto från <ph name="PASSWORD_MANAGER_BRAND" /> för att logga in</translation>
 <translation id="9041603713188951722">Visa inställningar i ett fönster</translation>
 <translation id="904451693890288097">Ange lösenordet för <ph name="DEVICE_NAME" />:</translation>
 <translation id="904949795138183864">Webbsidan <ph name="URL" /> finns inte längre.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 4080ef9..eee1354 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3707,7 +3707,6 @@
 <translation id="6333834492048057036">Sehemu ya anwani ya kulenga ya kutafuta</translation>
 <translation id="6339034549827494595">Kibodi ya Fonetiki (AATSEEL) ya Kirusi</translation>
 <translation id="6341850831632289108">Kifaa kitambue haswa ulipo</translation>
-<translation id="6342069812937806050">Sasa hivi tu</translation>
 <translation id="634208815998129842">Kidhibiti cha shughuli</translation>
 <translation id="6344170822609224263">Pata orodha ya miunganisho ya mtandao</translation>
 <translation id="6344783595350022745">Futa Matini</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index cf5795e..909ff2d1 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -3706,7 +3706,6 @@
 <translation id="6333834492048057036">தேடலிற்காக முகவரி பட்டியைக் கவனி</translation>
 <translation id="6339034549827494595">ரஷ்யன் ஒலிப்புமுறை (AATSEEL) விசைப்பலகை</translation>
 <translation id="6341850831632289108">உங்கள் நிஜ இருப்பிடத்தைக் கண்டறியலாம்</translation>
-<translation id="6342069812937806050">இப்போது</translation>
 <translation id="634208815998129842">காரிய நிர்வாகி</translation>
 <translation id="6344170822609224263">பிணைய இணைப்புகளின் பட்டியலை அணுகு</translation>
 <translation id="6344783595350022745">உரையை அழி</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index b3f8c54..073a9a9 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3722,7 +3722,6 @@
 <translation id="6333834492048057036">శోధన చిరునామా పట్టీపై కేంద్రీకరించండి</translation>
 <translation id="6339034549827494595">రష్యన్ ఫొనెటిక్ (AATSEEL) కీబోర్డ్</translation>
 <translation id="6341850831632289108">మీ భౌతిక స్థానాన్ని గుర్తించండి</translation>
-<translation id="6342069812937806050">ఇప్పుడే</translation>
 <translation id="634208815998129842">విధి నిర్వాహికి</translation>
 <translation id="6344170822609224263">నెట్‌వర్క్ కనెక్షన్‌ల జాబితాను ప్రాప్యత చేయండి</translation>
 <translation id="6344783595350022745">వచనాన్ని క్లియర్ చేయి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index b9450d9..1822647 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -3704,7 +3704,6 @@
 <translation id="6333834492048057036">เน้นแถบที่อยู่เว็บสำหรับการค้นหา</translation>
 <translation id="6339034549827494595">แป้นพิมพ์การถ่ายเสียงภาษารัสเซีย (AATSEEL)</translation>
 <translation id="6341850831632289108">ตรวจหาตำแหน่งทางกายภาพของคุณ</translation>
-<translation id="6342069812937806050">เพิ่งเสร็จ</translation>
 <translation id="634208815998129842">ตัวจัดการงาน</translation>
 <translation id="6344170822609224263">เข้าถึงรายการเชื่อมต่อเครือข่าย</translation>
 <translation id="6344783595350022745">ข้อความที่ชัดเจน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index f1fd1d1f..3b75074 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -3725,7 +3725,6 @@
 <translation id="6333834492048057036">Aramak için adres çubuğuna odaklan</translation>
 <translation id="6339034549827494595">Rusça Fonetik (AATSEEL) klavye</translation>
 <translation id="6341850831632289108">Fiziksel konumunuzu belirleme</translation>
-<translation id="6342069812937806050">Az önce</translation>
 <translation id="634208815998129842">Görev yöneticisi</translation>
 <translation id="6344170822609224263">Ağ bağlantıları listesine erişme</translation>
 <translation id="6344783595350022745">Metni Temizle</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 6ac569c..15e851e 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -3698,7 +3698,6 @@
 <translation id="6333834492048057036">Вибрати адресний рядок для пошуку</translation>
 <translation id="6339034549827494595">Російська фонетична клавіатура (AATSEEL)</translation>
 <translation id="6341850831632289108">Визначати ваше фізичне місцезнаходження</translation>
-<translation id="6342069812937806050">Лише зараз</translation>
 <translation id="634208815998129842">Диспетчер завдань</translation>
 <translation id="6344170822609224263">Отримувати доступ до списку мережевих з’єднань</translation>
 <translation id="6344783595350022745">Очистити текст</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index ff2e031..e54b529 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -3732,7 +3732,6 @@
 <translation id="6333834492048057036">Tập trung vào thanh địa chỉ để tìm kiếm</translation>
 <translation id="6339034549827494595">Bàn phím ngữ âm tiếng Nga (AATSEEL)</translation>
 <translation id="6341850831632289108">Phát hiện vị trí thực của bạn</translation>
-<translation id="6342069812937806050">Vừa mới</translation>
 <translation id="634208815998129842">Trình quản lý tác vụ</translation>
 <translation id="6344170822609224263">Truy cập danh sách kết nối mạng</translation>
 <translation id="6344783595350022745">Xóa văn bản</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 8747dba..86fb527 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -3688,7 +3688,6 @@
 <translation id="6333834492048057036">将光标移到地址栏以进行搜索</translation>
 <translation id="6339034549827494595">俄语注音 (AATSEEL) 键盘</translation>
 <translation id="6341850831632289108">检测您所在的地理位置</translation>
-<translation id="6342069812937806050">刚刚</translation>
 <translation id="634208815998129842">任务管理器</translation>
 <translation id="6344170822609224263">网络连接的访问权限列表</translation>
 <translation id="6344783595350022745">明文</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 8d15683..758e001 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -3701,7 +3701,6 @@
 <translation id="6333834492048057036">將焦點移至網址列以便進行搜尋</translation>
 <translation id="6339034549827494595">俄文語音 (AATSEEL) 鍵盤</translation>
 <translation id="6341850831632289108">偵測您的實際位置</translation>
-<translation id="6342069812937806050">剛剛</translation>
 <translation id="634208815998129842">工作管理員</translation>
 <translation id="6344170822609224263">存取網路連線清單</translation>
 <translation id="6344783595350022745">清除文字</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index dbd831d4..18122b64 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
 <translation id="1001534784610492198">የጫኝው መዝገብ ተሰናክሏል ወይም ትክክል አይደለም። እባክዎ Google Chromeን እንደገና ያውርዱ።</translation>
+<translation id="1013290471399003443"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chrome አረጋግጧል። አገልጋዩ ልክ የሆነ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል።</translation>
 <translation id="1016765312371154165">Chrome በትክክል አልተዘጋም ነበር።</translation>
 <translation id="103396972844768118">የChrome ውሂብዎን በተመለከተ አስፈላጊ መረጃ</translation>
 <translation id="1061441684050139317">Chrome እሱን ለዚህ ጣቢያ ለማጋራት የማይክሮፎን መዳረሻ ያስፈልገዋል።</translation>
@@ -66,6 +67,7 @@
 <translation id="2769762047821873045">Google Chrome መነሻ ማሰሻዎ አይደለም።</translation>
 <translation id="2770231113462710648">ነባሪ አሳሽን ወደዚህ ቀይር፦</translation>
 <translation id="2871893339301912279">ወደ Chrome ገብተዋል!</translation>
+<translation id="2997147809295888909"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chrome አረጋግጧል። አገልጋዩ ማንኛውንም የምስክር ወረቀት ግልፅነት መረጃን አላቀረበም።</translation>
 <translation id="3037838751736561277">Google Chrome በጀርባ ሁኔታ ላይ ነው።</translation>
 <translation id="3047079729301751317"><ph name="USERNAME" />ን ግንኙነት ማቋረጥ ታሪክዎን፣ ቅንበሮችዎን እና ሌሎች በዚህ መሳሪያ ላይ የተቀመጡትን ሌሎች የChrome ውሂብ ያጸዳል። በGoogle መለያዎ ላይ ያለው ውሂብ የማይጸዳ ሲሆን በ<ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" /> ላይ መተዳደር ይችላል።</translation>
 <translation id="3080151273017101988">Google Chrome ሲዘጋ የጀርባ መተግበሪያዎችን ማሂዱን ይቀጥሉ</translation>
@@ -88,6 +90,7 @@
 <translation id="3847841918622877581">Google Chrome የአሰሳ ተሞክሮዎን ለማሻሻል የድር አገልግሎቶችን ሊጠቀም ይችላል።</translation>
 <translation id="386202838227397562">እባክዎ ሁሉንም የChrome መስኮቶች ይዝጉና እንደገና ይሞክሩ።</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chrome አረጋግጧል። አገልጋዩ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል፣ ሆኖም ግን Chrome ማንኛውንም የምስክር ወረቀት ግልፅነት ምዝግብ ማስታወሻዎችን አያውቅም።</translation>
 <translation id="3889417619312448367">Google Chromeን አራግፍ</translation>
 <translation id="4011219958405096740">በሚነቃበት ጊዜ፣ በiframe-ላይ የተመረኮዘ የChrome በመለያ መግቢያ ፍሰትን የሚጠቀም ሲሆን ይህ ካልሆነ ግን በwebview-ላይ የተመረኮዘ ፍሰትን ይጠቀማል።</translation>
 <translation id="4050175100176540509">አስፈላጊ የደህንነት ማሻሻያዎች እና አዲስ ባህሪያት በቅርብ ጊዜው ስሪቱ ላይ ይገኛሉ።</translation>
@@ -118,6 +121,7 @@
 <translation id="4794050651896644714">ዝርዝሮችን Chrome ውስጥ አስቀምጥ</translation>
 <translation id="4891791193823137474">Google Chrome በጀርባ ውስጥ ይሂድ</translation>
 <translation id="4921569541910214635">ኮምፒውተር ይጋራሉ? አሁን Chromeን ልክ እንደሚፈልጉት አድርገው ማዋቀር ይችላሉ።</translation>
+<translation id="4925019873400497719"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chrome አረጋግጧል። አገልጋዩ የምስክር ወረቀት ግልፅነት መረጃን አቅርቧል፣ ሆኖም ግን ልክ ያልሆነ ነበር።</translation>
 <translation id="4953650215774548573">Google Chromeን እንደ ነባሪ አሳሽዎ አድርገው ያቀናብሩ</translation>
 <translation id="4987308747895123092">እባክዎ ሁሉንም የGoogle Chrome መስኮቶችን (በWindows 8 ሁነታ ላይ ያሉትንም ጨምሮ) ይዝጉና እንደገና ይሞክሩ።</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index 37d93b1..e221b3f 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
 <translation id="1001534784610492198">‏أرشيف المثبت تالف أو غير صالح. يُرجى تنزيل Google Chrome مرة أخرى.</translation>
+<translation id="1013290471399003443">‏تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة الصالحة.</translation>
 <translation id="1016765312371154165">‏لم يتم إيقاف تشغيل Chrome بشكل صحيح.</translation>
 <translation id="103396972844768118">‏معلومات مهمة بخصوص بياناتك في Chrome</translation>
 <translation id="1061441684050139317">‏يحتاج Chrome إلى الحصول على حق الوصول إلى الميكرفون لمشاركته مع هذا الموقع.</translation>
@@ -64,6 +65,7 @@
 <translation id="2769762047821873045">‏ليس Google Chrome متصفحك الافتراضي.</translation>
 <translation id="2770231113462710648">تغيير المتصفح الافتراضي إلى:</translation>
 <translation id="2871893339301912279">‏تم تسجيل دخولك إلى Chrome!</translation>
+<translation id="2997147809295888909">‏تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. ولم يقدم الخادم أي معلومات لشفافية الشهادة.</translation>
 <translation id="3037838751736561277">‏Google Chrome في وضع الخلفية.</translation>
 <translation id="3047079729301751317">‏سيؤدي قطع اتصال <ph name="USERNAME" /> إلى مسح السجّل والإشارات المرجعية والإعدادات وبيانات Chrome الأخرى المخزنة على هذا الجهاز. لن يتم مسح البيانات المخزنة في حساب Google ويمكن إدارتها على <ph name="GOOGLE_DASHBOARD_LINK" />لوحة تحكم Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">‏استمرار تشغيل تطبيقات الخلفية عند إغلاق Google Chrome</translation>
@@ -86,6 +88,7 @@
 <translation id="3847841918622877581">‏قد يستخدم Google Chrome خدمات الويب لتحسين تجربة التصفح لديك.</translation>
 <translation id="386202838227397562">‏الرجاء إغلاق كل نوافذ Google Chrome وإعادة المحاولة.</translation>
 <translation id="3870154837782082782">Google Inc‎.‎</translation>
+<translation id="3881912906674381083">‏تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة، ولكن لم يتعرّف Chrome على أي سجلات لشفافية الشهادة.</translation>
 <translation id="3889417619312448367">‏إزالة Google Chrome</translation>
 <translation id="4011219958405096740">‏عند تمكينه، سيستخدم تدفق تسجيل دخول Chrome القائم على iframe؛ وإلا سيستخدم تدفقًا قائمًا على عرض الويب.</translation>
 <translation id="4050175100176540509">تحسينات الأمان المهمة والميزات الجديدة متاحة في أحدث إصدار.</translation>
@@ -116,6 +119,7 @@
 <translation id="4794050651896644714">‏حفظ التفاصيل في Chrome</translation>
 <translation id="4891791193823137474">‏دع Google Chrome يعمل في الخلفية</translation>
 <translation id="4921569541910214635">‏هل تشارك جهاز كمبيوتر؟ يمكنك الآن إعداد Chrome بالطريقة التي تعجبك تمامًا.</translation>
+<translation id="4925019873400497719">‏تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. وقدم الخادم معلومات شفافية الشهادة، ولكنها غير صالحة.</translation>
 <translation id="4953650215774548573">‏تعيين Google Chrome المتصفح الافتراضي</translation>
 <translation id="4987308747895123092">‏الرجاء إغلاق جميع نوافذ Google Chrome (بما في ذلك تلك المفتوحة في وضع Windows 8) ثم إعادة المحاولة.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index b9d20d3..5392364 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
 <translation id="1001534784610492198">Το αρχείο του προγράμματος εγκατάστασης είναι κατεστραμμένο ή μη έγκυρο. Κατεβάστε το Google Chrome ξανά.</translation>
+<translation id="1013290471399003443">Το Chrome επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν έγκυρες πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή.</translation>
 <translation id="1016765312371154165">Η λειτουργία του Chrome δεν τερματίστηκε σωστά.</translation>
 <translation id="103396972844768118">Σημαντικές πληροφορίες σχετικά με τα δεδομένα σας στο Chrome</translation>
 <translation id="1061441684050139317">Το Chrome χρειάζεται πρόσβαση στο μικρόφωνο προκειμένου να το μοιραστεί με αυτόν τον ιστότοπο.</translation>
@@ -64,6 +65,7 @@
 <translation id="2769762047821873045">Το Google Chrome δεν είναι το προεπιλεγμένο πρόγραμμα περιήγησης.</translation>
 <translation id="2770231113462710648">Αλλαγή προεπιλεγμένου προγράμματος περιήγησης σε:</translation>
 <translation id="2871893339301912279">Έχετε συνδεθεί στο Chrome!</translation>
+<translation id="2997147809295888909">Το Chrome επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Δεν παρασχέθηκαν πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή.</translation>
 <translation id="3037838751736561277">Το Google Chrome εκτελείται στο παρασκήνιο.</translation>
 <translation id="3047079729301751317">Με την αποσύνδεση του λογαριασμού <ph name="USERNAME" />, θα διαγραφεί το ιστορικό, οι  σελιδοδείκτες, οι ρυθμίσιες σας και άλλα δεδομένα Chrome που έχουν αποθηκευτεί σε αυτήν τη συσκευή. Τα δεδομένα που έχουν αποθηκευτεί στον Λογαριασμό σας Google δεν θα διαγραφούν και μπορείτε να τα διαχειριστείτε μέσω του <ph name="GOOGLE_DASHBOARD_LINK" />Πίνακα ελέγχου Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Να συνεχίζεται η εκτέλεση εφαρμογών παρασκηνίου όταν το Google Chrome είναι κλειστό</translation>
@@ -86,6 +88,7 @@
 <translation id="3847841918622877581">Το Google Chrome μπορεί να χρησιμοποιήσει υπηρεσίες ιστού για να βελτιώσει την εμπειρία περιήγησής σας.</translation>
 <translation id="386202838227397562">Κλείστε όλα τα παράθυρα του Google Chrome και προσπαθήστε ξανά.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">Το Chrome επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν πληροφορίες διαφάνειας πιστοποίησης από το διακομιστή αλλά το Chrome δεν αναγνώρισε κανένα από τα αρχεία καταγραφής της διαφάνειας πιστοποίησης.</translation>
 <translation id="3889417619312448367">Κατάργηση εγκατάστασης Google Chrome</translation>
 <translation id="4011219958405096740">Επιτρέπει τις ροές σύνδεσης Chrome που βασίζονται σε iframe. Διαφορετικά, χρησιμοποιείται ροή που βασίζεται σε προβολή ιστού.</translation>
 <translation id="4050175100176540509">Στην πιο πρόσφατη έκδοση διατίθενται σημαντικές βελτιώσεις ασφάλειας και νέες λειτουργίες.</translation>
@@ -116,6 +119,7 @@
 <translation id="4794050651896644714">Αποθήκευση λεπτομερειών στο Chrome</translation>
 <translation id="4891791193823137474">Να επιτρέπεται στο Google Chrome να εκτελείται στο παρασκήνιο</translation>
 <translation id="4921569541910214635">Μοιράζεστε έναν υπολογιστή; Τώρα μπορείτε να ρυθμίσετε το Chrome όπως ακριβώς σας αρέσει.</translation>
+<translation id="4925019873400497719">Το Chrome επαλήθευσε ότι το πιστοποιητικό του ιστότοπου εκδόθηκε από το <ph name="ISSUER" />. Παρασχέθηκαν πληροφορίες διαφάνειας πιστοποιητικού από το διακομιστή αλλά δεν ήταν έγκυρες.</translation>
 <translation id="4953650215774548573">Ορίστε το Google Chrome ως προεπιλεγμένο πρόγραμμα περιήγησης</translation>
 <translation id="4987308747895123092">Κλείστε όλα τα παράθυρα του Google Chrome (περιλαμβανομένων όσων βρίσκονται σε λειτουργία Windows 8) και δοκιμάστε ξανά.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 77d9858..2dd3f3e9 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
 <translation id="1001534784610492198">The installer archive is corrupted or invalid. Please download Google Chrome again.</translation>
+<translation id="1013290471399003443">Chrome verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied valid Certificate Transparency information.</translation>
 <translation id="1016765312371154165">Chrome didn't shut down correctly.</translation>
 <translation id="103396972844768118">Important information regarding your Chrome data</translation>
 <translation id="1061441684050139317">Chrome needs microphone access to share it with this site.</translation>
@@ -66,6 +67,7 @@
 <translation id="2769762047821873045">Google Chrome isn't your default browser.</translation>
 <translation id="2770231113462710648">Change default browser to:</translation>
 <translation id="2871893339301912279">You're signed in to Chrome!</translation>
+<translation id="2997147809295888909">Chrome verified that <ph name="ISSUER" /> issued this website's certificate. The server did not supply any Certificate Transparency information.</translation>
 <translation id="3037838751736561277">Google Chrome is in background mode.</translation>
 <translation id="3047079729301751317">Disconnecting <ph name="USERNAME" /> will clear your history, bookmarks, settings and other Chrome data stored on this device. Data stored in your Google Account will not be cleared and can be managed on <ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Continue running background apps when Google Chrome is closed</translation>
@@ -88,6 +90,7 @@
 <translation id="3847841918622877581">Google Chrome may use web services to improve your browsing experience.</translation>
 <translation id="386202838227397562">Please close all Google Chrome windows and try again.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">Chrome verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied Certificate Transparency information, but Chrome did not recognise any of the Certificate Transparency logs.</translation>
 <translation id="3889417619312448367">Uninstall Google Chrome</translation>
 <translation id="4011219958405096740">When enabled, will use an iframe-based Chrome sign-in flow; otherwise uses a webview-based flow.</translation>
 <translation id="4050175100176540509">Important security improvements and new features are available in the latest version.</translation>
@@ -118,6 +121,7 @@
 <translation id="4794050651896644714">Save details in Chrome</translation>
 <translation id="4891791193823137474">Let Google Chrome run in the background</translation>
 <translation id="4921569541910214635">Share a computer? Now you can set up Chrome just the way you like it.</translation>
+<translation id="4925019873400497719">Chrome verified that <ph name="ISSUER" /> issued this website's certificate. The server supplied Certificate Transparency information, but it was invalid.</translation>
 <translation id="4953650215774548573">Set Google Chrome as your default browser</translation>
 <translation id="4987308747895123092">Please close all Google Chrome windows (including those in Windows 8 mode) and try again.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index af42864db..9365855 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="1001534784610492198">Na-corrupt o hindi wasto ang installer archive. Paki-download muli ang Google Chrome.</translation>
+<translation id="1013290471399003443">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng wastong impormasyon tungkol sa Certificate Transparency.</translation>
 <translation id="1016765312371154165">Hindi nag-shut down nang tama ang Chrome.</translation>
 <translation id="103396972844768118">Mahalagang impormasyon patungkol sa iyong data sa Chrome</translation>
 <translation id="1061441684050139317">Kailangan ng Chrome ng access sa mikropono upang maibahagi ito sa site na ito.</translation>
@@ -66,6 +67,7 @@
 <translation id="2769762047821873045">Hindi Google Chrome ang iyong default na browser.</translation>
 <translation id="2770231113462710648">Baguhin ang default na browser sa:</translation>
 <translation id="2871893339301912279">Naka-sign in ka sa Chrome!</translation>
+<translation id="2997147809295888909">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Hindi nagbigay ang server ng anumang impormasyon tungkol sa Certificate Transparency.</translation>
 <translation id="3037838751736561277">Nasa background mode ang Google Chrome.</translation>
 <translation id="3047079729301751317">Iki-clear ng pagdiskonekta kay <ph name="USERNAME" /> ang iyong history, mga bookmark, setting at iba pang data ng Chrome na naka-imbak sa device na ito. Hindi iki-clear ang data na naka-imbak sa iyong Google Account at maaaring pamahalaan sa <ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Magpatuloy sa pagpapatakbo ng mga app sa background kapag nakasara ang Google Chrome</translation>
@@ -88,6 +90,7 @@
 <translation id="3847841918622877581">Maaaring gumamit ang Google Chrome ng mga serbisyo sa web upang mapabuti ang iyong karanasan sa pagba-browse.</translation>
 <translation id="386202838227397562">Mangyaring isara lahat ng mga window ng Google Chrome at muling subukan.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng impormasyon tungkol sa Certificate Transparency, ngunit hindi natukoy ng Chrome ang alinman sa mga log ng Certificate Transparency</translation>
 <translation id="3889417619312448367">I-uninstall ang Google Chrome</translation>
 <translation id="4011219958405096740">Kapag naka-enable, ito ay gagamit ng daloy ng pag-sign in ng Chrome na batay sa iframe; kung hindi man, ito ay gumagamit ng daloy na batay sa webview.</translation>
 <translation id="4050175100176540509">May available na mahahalagang pagpapahusay sa seguridad at mga bagong feature sa pinakabagong bersyon.</translation>
@@ -118,6 +121,7 @@
 <translation id="4794050651896644714">I-save ang mga detalye sa Chrome</translation>
 <translation id="4891791193823137474">Hayaan ang Google Chrome na tumakbo sa background</translation>
 <translation id="4921569541910214635">Magbabahagi ng computer? Ngayon, maaari mong i-set up ang Chrome sa paraang gusto mo.</translation>
+<translation id="4925019873400497719">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito. Nagbigay ang server ng impormasyon tungkol sa Certificate Transparency, ngunit hindi iyon wasto.</translation>
 <translation id="4953650215774548573">Itakda ang Google Chrome bilang iyong default na browser</translation>
 <translation id="4987308747895123092">Pakisara ang lahat ng window ng Google Chrome (kasama ang mga nasa mode na Windows 8) at subukang muli.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 4c6c9b0..fb062308 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
 <translation id="1001534784610492198">Arsip instalatur rusak atau tidak valid. Unduh kembali Google Chrome.</translation>
+<translation id="1013290471399003443">Chrome memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat yang valid.</translation>
 <translation id="1016765312371154165">Chrome tidak dinonaktifkan dengan benar.</translation>
 <translation id="103396972844768118">Informasi penting terkait data Chrome Anda</translation>
 <translation id="1061441684050139317">Chrome memerlukan akses mikrofon untuk berbagi dengan situs ini.</translation>
@@ -62,6 +63,7 @@
 <translation id="2769762047821873045">Google Chrome bukan browser default.</translation>
 <translation id="2770231113462710648">Ubah browser default ke:</translation>
 <translation id="2871893339301912279">Anda sudah masuk ke Chrome!</translation>
+<translation id="2997147809295888909">Chrome memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server tidak memberikan informasi Transparansi Sertifikat apa pun.</translation>
 <translation id="3037838751736561277">Google Chrome berjalan di mode latar belakang.</translation>
 <translation id="3047079729301751317">Memutuskan sambungan <ph name="USERNAME" /> akan menghapus riwayat, bookmark, setelan, dan data Chrome Anda lainnya yang tersimpan di perangkat. Data tersimpan di Akun Google tidak akan dihapus dan dapat dikelola di <ph name="GOOGLE_DASHBOARD_LINK" />Google Dasbor<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Terus jalankan apl latar belakang saat Google Chrome ditutup</translation>
@@ -84,6 +86,7 @@
 <translation id="3847841918622877581">Google Chrome dapat menggunakan layanan web guna meningkatkan pengalaman menjelajahi Anda.</translation>
 <translation id="386202838227397562">Tutup semua jendela Google Chrome, lalu coba lagi.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">Chrome memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat, namun Chrome tidak mengenali log Transparansi Sertifikat apa pun.</translation>
 <translation id="3889417619312448367">Hapus Penginstalan Google Chrome</translation>
 <translation id="4011219958405096740">Jika diaktifkan, alur masuk Chrome berbasis iframe akan digunakan; jika tidak, yang digunakan adalah alur berbasis tampilan web.</translation>
 <translation id="4050175100176540509">Peningkatan keamanan dan fitur baru yang penting tersedia di versi terbaru.</translation>
@@ -114,6 +117,7 @@
 <translation id="4794050651896644714">Simpan detail di Chrome</translation>
 <translation id="4891791193823137474">Jalankan Google Chrome di latar belakang</translation>
 <translation id="4921569541910214635">Membagikan komputer? Kini Anda dapat menyiapkan Chrome seperti yang Anda inginkan.</translation>
+<translation id="4925019873400497719">Chrome memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini. Server memberikan informasi Transparansi Sertifikat, namun informasi tersebut tidak valid.</translation>
 <translation id="4953650215774548573">Setel Google Chrome sebagai browser default Anda</translation>
 <translation id="4987308747895123092">Tutup semua jendela Google Chrome (termasuk jendela dalam mode Windows 8) dan coba lagi.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index 22aaab1..f9a3d01 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
 <translation id="1001534784610492198">‏הארכיון של המתקין פגום או שאינו חוקי. הורד שוב את Google Chrome.</translation>
+<translation id="1013290471399003443">‏Chrome אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת סיפק פרטים חוקיים על שקיפות האישור.</translation>
 <translation id="1016765312371154165">‏כיבוי Chrome לא בוצע כהלכה.</translation>
 <translation id="103396972844768118">‏מידע חשוב בנוגע לנתונים שלך ב-Chrome</translation>
 <translation id="1061441684050139317">‏Chrome זקוק לגישה למיקרופון כדי לשתף אותו עם האתר הזה.</translation>
@@ -62,6 +63,7 @@
 <translation id="2769762047821873045">‏Google Chrome‏ אינו דפדפן ברירת המחדל שלך.</translation>
 <translation id="2770231113462710648">שנה את דפדפן ברירת המחדל ל:</translation>
 <translation id="2871893339301912279">‏נכנסת ל-Chrome!</translation>
+<translation id="2997147809295888909">‏Chrome אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת לא סיפק פרטים על שקיפות האישור.</translation>
 <translation id="3037838751736561277">‏Google Chrome נמצא במצב רקע.</translation>
 <translation id="3047079729301751317">‏ניתוק <ph name="USERNAME" /> ינקה את ההיסטוריה, הסימניות, ההגדרות ונתוני Chrome אחרים המאוחסנים במכשיר הזה. נתונים המאוחסנים בחשבון Google לא ינוקו, וניתן לנהל אותם <ph name="GOOGLE_DASHBOARD_LINK" />במרכז השליטה של Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">‏המשך הפעלת יישומים ברקע כאשר Google Chrome סגור</translation>
@@ -84,6 +86,7 @@
 <translation id="3847841918622877581">‏Google Chrome עשוי להשתמש בשירותי אינטרנט כדי לשפר את חווית הגלישה שלך.</translation>
 <translation id="386202838227397562">‏סגור את כל החלונות של Google Chrome ונסה שוב.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">‏Chrome אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת סיפק פרטים על שקיפות האישור, אבל Chrome לא זיהה את היומנים של שקיפות האישור.</translation>
 <translation id="3889417619312448367">‏הסר את Google Chrome</translation>
 <translation id="4011219958405096740">‏כשמצב זה מופעל, יעשה שימוש בתהליך כניסה אל Chrome המבוסס על iframe. אם לא יופעל, יעשה שימוש בתהליך המבוסס על WebView.</translation>
 <translation id="4050175100176540509">הגרסה החדשה כוללת שיפורי בטיחות חשובים ותכונות חדשות.</translation>
@@ -114,6 +117,7 @@
 <translation id="4794050651896644714">‏שמור פרטים ב-Chrome</translation>
 <translation id="4891791193823137474">‏אפשר ל-Google Chrome לפעול ברקע</translation>
 <translation id="4921569541910214635">‏משתף את המחשב? עכשיו תוכל להגדיר את Chrome בדיוק כמו שאתה אוהב.</translation>
+<translation id="4925019873400497719">‏Chrome אימת ש-<ph name="ISSUER" /> הנפיק את אישור האתר. השרת סיפק פרטים על שקיפות האישור אבל הם לא חוקיים.</translation>
 <translation id="4953650215774548573">‏הגדר את Google Chrome כדפדפן ברירת המחדל</translation>
 <translation id="4987308747895123092">‏סגור את כל החלונות של Google Chrome (כולל חלונות במצב Windows 8) ונסה שוב.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 7ced8f9..654b840 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
 <translation id="1001534784610492198">Arkib pemasang rosak atau tidak sah. Sila muat turun Google Chrome semula.</translation>
+<translation id="1013290471399003443">Chrome mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil yang sah.</translation>
 <translation id="1016765312371154165">Chrome tidak ditutup dengan betul.</translation>
 <translation id="103396972844768118">Maklumat penting mengenai data Chrome anda</translation>
 <translation id="1061441684050139317">Chrome memerlukan akses mikrofon untuk mengongsikannya dengan tapak ini.</translation>
@@ -62,6 +63,7 @@
 <translation id="2769762047821873045">Google Chrome adalah bukan penyemak imbas lalai anda.</translation>
 <translation id="2770231113462710648">Tukar penyemak imbas lalai kepada:</translation>
 <translation id="2871893339301912279">Anda kini telah log masuk ke Chrome!</translation>
+<translation id="2997147809295888909">Chrome mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan tidak membekalkan sebarang maklumat Ketelusan Sijil.</translation>
 <translation id="3037838751736561277">Google Chrome dalam mod latar belakang.</translation>
 <translation id="3047079729301751317">Memutuskan sambungan <ph name="USERNAME" /> akan mengosongkan sejarah anda, penanda halaman, tetapan dan data Chrome lain yang tersimpan pada peranti ini. Data yang disimpan dalam Akaun Google anda tidak akan dikosongkan dan boleh diurus pada <ph name="GOOGLE_DASHBOARD_LINK" />Papan Pemuka Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Terus menjalankan apl latar belakang apabila Google Chrome ditutup</translation>
@@ -84,6 +86,7 @@
 <translation id="3847841918622877581">Google Chrome boleh menggunakan perkhidmatan web untuk meningkatkan pengalaman penyemakan imbas anda.</translation>
 <translation id="386202838227397562">Sila tutup semua tetingkap Google Chrome dan cuba semula.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">Chrome mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan siil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil, tetapi Chrome tidak mengenali mana-mana log Ketelusan Sijil.</translation>
 <translation id="3889417619312448367">Nyahpasang Google Chrome</translation>
 <translation id="4011219958405096740">Apabila didayakan, akan menggunakan aliran log masuk Chrome berasaskan iframe; atau pun gunakan aliran berasaskan webview.</translation>
 <translation id="4050175100176540509">Peningkatan keselamatan penting dan ciri baharu tersedia dalam versi terkini.</translation>
@@ -114,6 +117,7 @@
 <translation id="4794050651896644714">Simpan butiran di Chrome</translation>
 <translation id="4891791193823137474">Biarkan Google Chrome dijalankan di latar belakang</translation>
 <translation id="4921569541910214635">Berkongsi komputer? Kini anda boleh sediakan Chrome menurut cara yang anda suka.</translation>
+<translation id="4925019873400497719">Chrome mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan membekalkan maklumat Ketelusan Sijil, tetapi tidak sah.</translation>
 <translation id="4953650215774548573">Tetapkan Google Chrome sebagai penyemak imbas lalai anda</translation>
 <translation id="4987308747895123092">Sila tutup semua tetingkap Google Chrome (termasuk yang di dalam mod Windows 8) dan cuba lagi.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index dc32c1e..6f6a395c 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
 <translation id="1001534784610492198">Archív inštalácie je poškodený alebo neplatný. Stiahnite prehliadač Google Chrome znova.</translation>
+<translation id="1013290471399003443">Chrome overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol platné informácie o transparentnosti certifikátu.</translation>
 <translation id="1016765312371154165">Chrome nebol správne vypnutý.</translation>
 <translation id="103396972844768118">Dôležité informácie týkajúce sa údajov prehliadača Chrome</translation>
 <translation id="1061441684050139317">Na to, aby Chrome mohol s týmito webovými stránkami zdieľať mikrofón, musí mať k nemu prístup.</translation>
@@ -64,6 +65,7 @@
 <translation id="2769762047821873045">Google Chrome nie je váš predvolený prehliadač.</translation>
 <translation id="2770231113462710648">Zmeniť predvolený prehliadač na:</translation>
 <translation id="2871893339301912279">Ste prihlásený/-á do prehliadača Chrome.</translation>
+<translation id="2997147809295888909">Chrome overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server neposkytol žiadne informácie o transparentnosti certifikátu.</translation>
 <translation id="3037838751736561277">Google Chrome je v režime na pozadí.</translation>
 <translation id="3047079729301751317">Ak odpojíte účet <ph name="USERNAME" />, vymaže sa história, záložky, nastavenia a všetky ďalšie údaje prehliadača Chrome uložené na vašom zariadení. Údaje uložené v účte Google sa nevymažú a môžete ich spravovať v službe <ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Ponechať aplikácie na pozadí spustené po zatvorení prehliadača Google Chrome</translation>
@@ -86,6 +88,7 @@
 <translation id="3847841918622877581">Prehliadač Google Chrome vám môže spríjemniť prehliadanie pomocou webových služieb.</translation>
 <translation id="386202838227397562">Zatvorte všetky okná prehliadača Google Chrome a skúste to znova.</translation>
 <translation id="3870154837782082782">Spoločnosť Google Inc.</translation>
+<translation id="3881912906674381083">Chrome overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol informácie o transparentnosti certifikátu, Chrome však nerozpoznal žiadne denníky transparentnosti certifikátu.</translation>
 <translation id="3889417619312448367">Odinštalovanie prehliadača Google Chrome</translation>
 <translation id="4011219958405096740">Keď je táto možnosť povolená, bude sa používať prihlasovací postup prehliadača Chrome založený na prvku iframe; inak sa použije postup založený na webovom zobrazení.</translation>
 <translation id="4050175100176540509">V najnovšej verzii sú k dispozícii dôležité vylepšenia zabezpečenia a nové funkcie.</translation>
@@ -116,6 +119,7 @@
 <translation id="4794050651896644714">Uložiť podrobnosti v prehliadači Chrome</translation>
 <translation id="4891791193823137474">Povoliť prehliadaču Google Chrome spustenie na pozadí</translation>
 <translation id="4921569541910214635">Zdieľať počítač? Teraz si môžete prehliadač Chrome nastaviť podľa vlastných predstáv.</translation>
+<translation id="4925019873400497719">Chrome overil, že certifikát tohto webu bol vydaný vydavateľom <ph name="ISSUER" />. Server poskytol informácie o transparentnosti certifikátu, boli však neplatné.</translation>
 <translation id="4953650215774548573">Nastaviť Google Chrome ako predvolený prehliadač</translation>
 <translation id="4987308747895123092">Zatvorte všetky okná prehliadača Google Chrome (vrátane okien v režime systému Windows 8) a skúste to znova.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index abdeb58..ae88cd7 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -2,6 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
 <translation id="1001534784610492198">Arkivet för installationsfilen är skadat eller ogiltigt. Ladda ned Google Chrome igen.</translation>
+<translation id="1013290471399003443">Chrome har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Giltiga certifikattransparensuppgifter har skickats från servern.</translation>
 <translation id="1016765312371154165">Chrome avslutades inte korrekt.</translation>
 <translation id="103396972844768118">Viktig information om uppgifter i Chrome</translation>
 <translation id="1061441684050139317">Chrome behöver tillgång till mikrofonen för att kunna dela den på den här webbplatsen.</translation>
@@ -66,6 +67,7 @@
 <translation id="2769762047821873045">Google Chrome är inte din standardwebbläsare.</translation>
 <translation id="2770231113462710648">Ändra standardwebbläsare till:</translation>
 <translation id="2871893339301912279">Du är inloggad i Chrome.</translation>
+<translation id="2997147809295888909">Chrome har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Inga certifikattransparensuppgifter skickades från servern.</translation>
 <translation id="3037838751736561277">Google Chrome körs i bakgrundsläge.</translation>
 <translation id="3047079729301751317">Om du kopplar från <ph name="USERNAME" /> rensas din historik, dina bokmärken, dina inställningar och annan Chrome-data som du har lagrat på enheten. Data som lagras i Google-kontot rensas inte utan kan hanteras via <ph name="GOOGLE_DASHBOARD_LINK" />Google Översikt<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
 <translation id="3080151273017101988">Fortsätt köra bakgrundsappar när Google Chrome avslutas</translation>
@@ -88,6 +90,7 @@
 <translation id="3847841918622877581">Google Chrome kan använda webbtjänster för att förbättra din upplevelse när du surfar.</translation>
 <translation id="386202838227397562">Stäng alla Google Chrome-fönster och försök igen.</translation>
 <translation id="3870154837782082782">Google Inc.</translation>
+<translation id="3881912906674381083">Chrome har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Certifikattransparensuppgifter har skickats från servern, men Chrome kunde inte känna igen någon av certifikattransparensloggarna.</translation>
 <translation id="3889417619312448367">Avinstallera Google Chrome</translation>
 <translation id="4011219958405096740">När det här alternativet är aktiverat används ett iframe-baserat inloggningsflöde i Chrome. Annars används ett flöde baserat på WebView.</translation>
 <translation id="4050175100176540509">Den senaste versionen har viktiga säkerhetsförbättringar och nya funktioner.</translation>
@@ -118,6 +121,7 @@
 <translation id="4794050651896644714">Spara information i Chrome</translation>
 <translation id="4891791193823137474">Låt Google Chrome köras i bakgrunden</translation>
 <translation id="4921569541910214635">Delar du dator? Nu kan du konfigurera Chrome precis som du vill.</translation>
+<translation id="4925019873400497719">Chrome har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. De certifikattransparensuppgifter som skickades från servern är ogiltiga.</translation>
 <translation id="4953650215774548573">Ange Google Chrome som standardwebbläsare</translation>
 <translation id="4987308747895123092">Stäng alla Google Chrome-fönster (inklusive i Windows 8-läge) och försök igen.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
diff --git a/chrome/app/settings_chromium_strings.grdp b/chrome/app/settings_chromium_strings.grdp
index 2e1b7df..f22ad9a0 100644
--- a/chrome/app/settings_chromium_strings.grdp
+++ b/chrome/app/settings_chromium_strings.grdp
@@ -32,6 +32,9 @@
   <message name="IDS_SETTINGS_SYNC_DATA_ENCRYPTED_TEXT" desc="Text alerting the user that synced data is encrypted.">
     For added security, Chromium will encrypt your data.
   </message>
+  <message name="IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION" desc="The text to display below the 'Stop syncing this account' button on the options pane, explaining what the button does.">
+    By disconnecting your Google Account from Chromium, your data will remain on this computer but changes will no longer be synced to your Google Account. Data already stored in your Google Account will remain there until you remove it using <ph name="BEGIN_LINK">&lt;a href="$1" target=&quot;_blank&quot;&gt;</ph>Google Dashboard<ph name="END_LINK">&lt;/a&gt;</ph>.
+  </message>
 
   <!-- Languages Page -->
   <if expr="chromeos">
diff --git a/chrome/app/settings_google_chrome_strings.grdp b/chrome/app/settings_google_chrome_strings.grdp
index d65d911..e8178d9 100644
--- a/chrome/app/settings_google_chrome_strings.grdp
+++ b/chrome/app/settings_google_chrome_strings.grdp
@@ -32,6 +32,9 @@
   <message name="IDS_SETTINGS_SYNC_DATA_ENCRYPTED_TEXT" desc="Text alerting the user that synced data is encrypted.">
     For added security, Google Chrome will encrypt your data.
   </message>
+  <message name="IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION" desc="The text to display below the 'Stop syncing this account' button on the options pane, explaining what the button does.">
+    By disconnecting your Google Account from Google Chrome, your data will remain on this computer but changes will no longer be synced to your Google Account. Data already stored in your Google Account will remain there until you remove it using <ph name="BEGIN_LINK">&lt;a href="$1" target=&quot;_blank&quot;&gt;</ph>Google Dashboard<ph name="END_LINK">&lt;/a&gt;</ph>.
+  </message>
 
   <!-- Languages Page -->
   <if expr="chromeos">
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index cffb87e..7108217 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -512,6 +512,19 @@
   </message>
 
   <!-- Sync Page -->
+  <message name="IDS_SETTINGS_SYNC_DISCONNECT" desc="The text to display on the button to indicate stop syncing functionality.">
+    Sign Out
+  </message>
+  <message name="IDS_SETTINGS_SYNC_DISCONNECT_TITLE" desc="The title of the dialog that explains what 'stop syncing' means.">
+    Disconnect your Google Account
+  </message>
+  <message name="IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE" desc="The text to display by the checkbox asking user whether to also delete profile when stopping sync.">
+    Also clear your history, bookmarks, settings, and other Chrome data stored on this device.
+  </message>
+  <message name="IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM" desc="The text to display on the button to confirm the user wishes to stop syncing.">
+    Clear and Disconnect
+  </message>
+
   <message name="IDS_SETTINGS_SYNC" desc="Name of the settings page which manages syncing data between multiple browser instances with the same Google profile.">
     Advanced sync settings
   </message>
diff --git a/chrome/app/theme/default_100_percent/common/content_top_left_corner.png b/chrome/app/theme/default_100_percent/common/content_top_left_corner.png
index 16e62bec..893a00a2 100644
--- a/chrome/app/theme/default_100_percent/common/content_top_left_corner.png
+++ b/chrome/app/theme/default_100_percent/common/content_top_left_corner.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/content_top_left_corner_mask.png b/chrome/app/theme/default_100_percent/common/content_top_left_corner_mask.png
index 9edd6cbd..9c7e1d0 100644
--- a/chrome/app/theme/default_100_percent/common/content_top_left_corner_mask.png
+++ b/chrome/app/theme/default_100_percent/common/content_top_left_corner_mask.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/content_top_right_corner.png b/chrome/app/theme/default_100_percent/common/content_top_right_corner.png
index cb96607..a5a7384 100644
--- a/chrome/app/theme/default_100_percent/common/content_top_right_corner.png
+++ b/chrome/app/theme/default_100_percent/common/content_top_right_corner.png
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/omnibox_search_secured.png b/chrome/app/theme/default_100_percent/common/omnibox_search_secured.png
deleted file mode 100644
index 99d61c30..0000000
--- a/chrome/app/theme/default_100_percent/common/omnibox_search_secured.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/omnibox_search_secured.png b/chrome/app/theme/default_200_percent/common/omnibox_search_secured.png
deleted file mode 100644
index 407a387..0000000
--- a/chrome/app/theme/default_200_percent/common/omnibox_search_secured.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_100_percent/common/omnibox_search_secured.png b/chrome/app/theme/material_100_percent/common/omnibox_search_secured.png
deleted file mode 100644
index fcda7cb0..0000000
--- a/chrome/app/theme/material_100_percent/common/omnibox_search_secured.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/omnibox_search_secured.png b/chrome/app/theme/material_200_percent/common/omnibox_search_secured.png
deleted file mode 100644
index 10a3e71..0000000
--- a/chrome/app/theme/material_200_percent/common/omnibox_search_secured.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index ac2ad6b4..2d9d1239 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -528,7 +528,6 @@
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_TOP_LEFT" file="common/omnibox_popup_border_and_shadow_top_left.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_TOP_RIGHT" file="common/omnibox_popup_border_and_shadow_top_right.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH_BUTTON_LOUPE" file="common/omnibox_search_button_loupe.png" />
-      <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH_SECURED" file="common/omnibox_search_secured.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SEARCH_SELECTED" file="common/omnibox_search_selected.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_BOTTOM" file="common/omnibox_selected_keyword_bubble_bottom.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_BOTTOM_LEFT" file="common/omnibox_selected_keyword_bubble_bottom_left.png" />
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5d34662..8151cf2 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -160,7 +160,7 @@
     "//components/security_interstitials/core",
     "//components/signin/core/browser",
     "//components/ssl_errors",
-    "//components/startup_metric_utils",
+    "//components/startup_metric_utils/browser",
     "//components/strings",
     "//components/suggestions",
     "//components/sync_bookmarks",
@@ -501,7 +501,7 @@
     deps += [
       "//chrome/browser/safe_browsing:chunk_proto",
       "//chrome/browser/safe_browsing:metadata_proto",
-      "//chrome/browser/safe_browsing:report_proto",
+      "//chrome/common/safe_browsing:proto",
     ]
     if (safe_browsing_mode == 1) {
       sources +=
@@ -568,12 +568,21 @@
   if (use_aura) {
     sources +=
         rebase_path(gypi_values.chrome_browser_aura_sources, ".", "//chrome")
+
+    # These files are only built in a GN build because they bring in
+    # dependencies that don't build with GYP.
+    sources += [
+      "mojo_runner_state.cc",
+      "mojo_runner_state.h",
+    ]
     deps += [
+      "//mojo/runner/child:lib",
       "//ui/aura",
       "//ui/compositor",
       "//ui/keyboard",
       "//ui/keyboard:keyboard_with_content",
     ]
+    defines += [ "MOJO_RUNNER_CLIENT" ]
   }
   if (ui_compositor_image_transport) {
     deps += [ "//ui/gl" ]
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 8cfb51e..0ba3baaa 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -96,7 +96,7 @@
   "+components/signin",
   "+components/ssl_config",
   "+components/ssl_errors",
-  "+components/startup_metric_utils",
+  "+components/startup_metric_utils/browser",
   "+components/storage_monitor",
   "+components/strings",
   "+components/suggestions",
@@ -149,6 +149,7 @@
   "+media/base",  # For media switches
   "+media/midi",  # For midi switches
   "+mojo/application/public/cpp",
+  "+mojo/runner/child",
   "+policy",  # For generated headers and source
   "+ppapi/c",  # For various types.
   "+ppapi/host",
diff --git a/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc b/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc
index 0f14228..16cece8 100644
--- a/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc
+++ b/chrome/browser/android/data_usage/data_use_tab_ui_manager_android.cc
@@ -9,10 +9,10 @@
 #include "jni/DataUseTabUIManager_jni.h"
 
 // static
-jboolean HasDataUseTrackingStarted(JNIEnv* env,
-                                   const JavaParamRef<jclass>& clazz,
-                                   jint tab_id,
-                                   const JavaParamRef<jobject>& jprofile) {
+jboolean CheckDataUseTrackingStarted(JNIEnv* env,
+                                     const JavaParamRef<jclass>& clazz,
+                                     jint tab_id,
+                                     const JavaParamRef<jobject>& jprofile) {
   // TODO(megjablon): Get the DataUseTabUIManager which is a keyed service and
   // ask it if data use tracking has started.
   // Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
@@ -20,16 +20,27 @@
 }
 
 // static
-jboolean HasDataUseTrackingEnded(JNIEnv* env,
-                                 const JavaParamRef<jclass>& clazz,
-                                 jint tab_id,
-                                 const JavaParamRef<jobject>& jprofile) {
+jboolean CheckDataUseTrackingEnded(JNIEnv* env,
+                                   const JavaParamRef<jclass>& clazz,
+                                   jint tab_id,
+                                   const JavaParamRef<jobject>& jprofile) {
   // TODO(megjablon): Get the DataUseTabUIManager which is a keyed service and
   // ask it if data use tracking has ended.
   // Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
   return false;
 }
 
+// static
+void OnCustomTabInitialNavigation(JNIEnv* env,
+                                  const JavaParamRef<jclass>& clazz,
+                                  jint tab_id,
+                                  const JavaParamRef<jstring>& url,
+                                  const JavaParamRef<jstring>& packageName,
+                                  const JavaParamRef<jobject>& jprofile) {
+  // TODO(megjablon): Get the DataUseTabUIManager which is a keyed service and
+  // tell it about the custom tab package.
+}
+
 bool RegisterDataUseTabUIManager(JNIEnv* env) {
   return RegisterNativesImpl(env);
 }
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index fb60c29..d6097b42 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -149,6 +149,7 @@
         <include name="IDR_MD_EXTENSIONS_MANAGER_CSS" file="resources\md_extensions\manager.css" type="BINDATA" />
         <include name="IDR_MD_EXTENSIONS_MANAGER_HTML" file="resources\md_extensions\manager.html" type="BINDATA" />
         <include name="IDR_MD_EXTENSIONS_MANAGER_JS" file="resources\md_extensions\manager.js" type="BINDATA" />
+        <include name="IDR_MD_EXTENSIONS_ICONS_HTML" file="resources\md_extensions\icons.html" type="BINDATA" />
         <include name="IDR_MD_EXTENSIONS_ITEM_CSS" file="resources\md_extensions\item.css" type="BINDATA" />
         <include name="IDR_MD_EXTENSIONS_ITEM_HTML" file="resources\md_extensions\item.html" type="BINDATA" />
         <include name="IDR_MD_EXTENSIONS_ITEM_JS" file="resources\md_extensions\item.js" type="BINDATA" />
diff --git a/chrome/browser/browsing_data/autofill_counter.cc b/chrome/browser/browsing_data/autofill_counter.cc
new file mode 100644
index 0000000..0b0633cc
--- /dev/null
+++ b/chrome/browser/browsing_data/autofill_counter.cc
@@ -0,0 +1,161 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/browsing_data/autofill_counter.h"
+
+#include <algorithm>
+#include <vector>
+
+#include "base/memory/scoped_vector.h"
+#include "chrome/browser/web_data_service_factory.h"
+#include "chrome/common/pref_names.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+
+AutofillCounter::AutofillCounter() : pref_name_(prefs::kDeleteFormData),
+                                     web_data_service_(nullptr),
+                                     suggestions_query_(0),
+                                     credit_cards_query_(0),
+                                     addresses_query_(0),
+                                     num_suggestions_(0),
+                                     num_credit_cards_(0),
+                                     num_addresses_(0) {
+}
+
+AutofillCounter::~AutofillCounter() {
+  CancelAllRequests();
+}
+
+void AutofillCounter::OnInitialized() {
+  web_data_service_ = WebDataServiceFactory::GetAutofillWebDataForProfile(
+      GetProfile(), ServiceAccessType::EXPLICIT_ACCESS);
+  DCHECK(web_data_service_);
+}
+
+const std::string& AutofillCounter::GetPrefName() const {
+  return pref_name_;
+}
+
+void AutofillCounter::SetPeriodStartForTesting(
+    const base::Time& period_start_for_testing) {
+  period_start_for_testing_ = period_start_for_testing;
+}
+
+void AutofillCounter::Count() {
+  const base::Time start = period_start_for_testing_.is_null()
+      ? GetPeriodStart()
+      : period_start_for_testing_;
+
+  CancelAllRequests();
+
+  // Count the autocomplete suggestions (also called form elements in Autofill).
+  // Note that |AutofillTable::RemoveFormElementsAddedBetween| only deletes
+  // those whose entire existence (i.e. the interval between creation time
+  // and last modified time) lies within the deletion time range. Otherwise,
+  // it only decreases the count property, but always to a nonzero value,
+  // and the suggestion is retained. Therefore here as well, we must only count
+  // the entry that are entirely contained in [start, base::Time::Max()).
+  suggestions_query_ = web_data_service_->GetCountOfEntriesContainedBetween(
+      start, base::Time::Max(), this);
+
+  // Count the credit cards.
+  credit_cards_query_ = web_data_service_->GetCreditCards(this);
+
+  // Count the addresses.
+  addresses_query_ = web_data_service_->GetAutofillProfiles(this);
+}
+
+void AutofillCounter::OnWebDataServiceRequestDone(
+    WebDataServiceBase::Handle handle, const WDTypedResult* result) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (!result) {
+    CancelAllRequests();
+    return;
+  }
+
+  const base::Time start = period_start_for_testing_.is_null()
+      ? GetPeriodStart()
+      : period_start_for_testing_;
+
+  if (handle == suggestions_query_) {
+    // Autocomplete suggestions.
+    DCHECK_EQ(AUTOFILL_VALUE_RESULT, result->GetType());
+    num_suggestions_ = static_cast<const WDResult<int>*>(result)->GetValue();
+    suggestions_query_ = 0;
+
+  } else if (handle == credit_cards_query_) {
+    // Credit cards.
+    DCHECK_EQ(AUTOFILL_CREDITCARDS_RESULT, result->GetType());
+    const std::vector<autofill::CreditCard*> credit_cards =
+        static_cast<const WDResult<std::vector<autofill::CreditCard*>>*>(
+            result)->GetValue();
+
+    // We own the result from this query. Make sure it will be deleted.
+    ScopedVector<const autofill::CreditCard> owned_result;
+    owned_result.assign(credit_cards.begin(), credit_cards.end());
+
+    num_credit_cards_ = std::count_if(
+        credit_cards.begin(),
+        credit_cards.end(),
+        [start](const autofill::CreditCard* card) {
+          return card->modification_date() >= start;
+        });
+    credit_cards_query_ = 0;
+
+  } else if (handle == addresses_query_) {
+    // Addresses.
+    DCHECK_EQ(AUTOFILL_PROFILES_RESULT, result->GetType());
+    const std::vector<autofill::AutofillProfile*> addresses =
+        static_cast<const WDResult<std::vector<autofill::AutofillProfile*>>*>(
+            result)->GetValue();
+
+    // We own the result from this query. Make sure it will be deleted.
+    ScopedVector<const autofill::AutofillProfile> owned_result;
+    owned_result.assign(addresses.begin(), addresses.end());
+
+    num_addresses_ = std::count_if(
+        addresses.begin(),
+        addresses.end(),
+        [start](const autofill::AutofillProfile* address) {
+          return address->modification_date() >= start;
+        });
+    addresses_query_ = 0;
+
+  } else {
+    NOTREACHED() << "No such query: " << handle;
+  }
+
+  // If we still have pending queries, do not report data yet.
+  if (HasPendingQuery())
+    return;
+
+  scoped_ptr<Result> reported_result(new AutofillResult(
+       this, num_suggestions_, num_credit_cards_, num_addresses_));
+  ReportResult(reported_result.Pass());
+}
+
+void AutofillCounter::CancelAllRequests() {
+  if (suggestions_query_)
+    web_data_service_->CancelRequest(suggestions_query_);
+  if (credit_cards_query_)
+    web_data_service_->CancelRequest(credit_cards_query_);
+  if (addresses_query_)
+    web_data_service_->CancelRequest(addresses_query_);
+}
+
+// AutofillCounter::AutofillResult ---------------------------------------------
+
+AutofillCounter::AutofillResult::AutofillResult(
+    const AutofillCounter* source,
+    ResultInt num_suggestions,
+    ResultInt num_credit_cards,
+    ResultInt num_addresses)
+    : FinishedResult(source, num_suggestions),
+      num_credit_cards_(num_credit_cards),
+      num_addresses_(num_addresses) {
+}
+
+AutofillCounter::AutofillResult::~AutofillResult() {
+}
diff --git a/chrome/browser/browsing_data/autofill_counter.h b/chrome/browser/browsing_data/autofill_counter.h
new file mode 100644
index 0000000..5072dd9
--- /dev/null
+++ b/chrome/browser/browsing_data/autofill_counter.h
@@ -0,0 +1,87 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_BROWSING_DATA_AUTOFILL_COUNTER_H_
+#define CHROME_BROWSER_BROWSING_DATA_AUTOFILL_COUNTER_H_
+
+#include "base/macros.h"
+#include "base/threading/thread_checker.h"
+#include "base/time/time.h"
+#include "chrome/browser/browsing_data/browsing_data_counter.h"
+#include "components/webdata/common/web_data_service_consumer.h"
+
+namespace autofill {
+class AutofillWebDataService;
+}
+
+class AutofillCounter: public BrowsingDataCounter,
+                       public WebDataServiceConsumer {
+ public:
+  class AutofillResult : public FinishedResult {
+   public:
+    AutofillResult(const AutofillCounter* source,
+                   ResultInt num_suggestions,
+                   ResultInt num_credit_cards,
+                   ResultInt num_addresses);
+    ~AutofillResult() override;
+
+    ResultInt num_credit_cards() const { return num_credit_cards_; }
+    ResultInt num_addresses() const { return num_addresses_; }
+
+   private:
+    ResultInt num_credit_cards_;
+    ResultInt num_addresses_;
+
+    DISALLOW_COPY_AND_ASSIGN(AutofillResult);
+  };
+
+  AutofillCounter();
+  ~AutofillCounter() override;
+
+  // BrowsingDataCounter implementation.
+  void OnInitialized() override;
+  const std::string& GetPrefName() const override;
+
+  // Whether the counting is in progress.
+  bool HasPendingQuery() {
+    return suggestions_query_ || credit_cards_query_ || addresses_query_;
+  }
+
+  // Set the beginning of the time period for testing. AutofillTable does not
+  // allow us to set time explicitly, and BrowsingDataCounter recognizes
+  // only predefined time periods, out of which the lowest one is one hour.
+  // Obviously, the test cannot run that long.
+  // TODO(msramek): Consider changing BrowsingDataCounter to use arbitrary
+  // time periods instead of BrowsingDataRemover::TimePeriod.
+  void SetPeriodStartForTesting(const base::Time& period_start_for_testing);
+
+ private:
+  const std::string pref_name_;
+  base::ThreadChecker thread_checker_;
+
+  scoped_refptr<autofill::AutofillWebDataService> web_data_service_;
+
+  WebDataServiceBase::Handle suggestions_query_;
+  WebDataServiceBase::Handle credit_cards_query_;
+  WebDataServiceBase::Handle addresses_query_;
+
+  ResultInt num_suggestions_;
+  ResultInt num_credit_cards_;
+  ResultInt num_addresses_;
+
+  base::Time period_start_for_testing_;
+
+  void Count() override;
+
+  // WebDataServiceConsumer implementation.
+  void OnWebDataServiceRequestDone(WebDataServiceBase::Handle handle,
+                                   const WDTypedResult* result) override;
+
+  // Cancel all pending requests to AutofillWebdataService.
+  void CancelAllRequests();
+
+  DISALLOW_COPY_AND_ASSIGN(AutofillCounter);
+};
+
+#endif  // CHROME_BROWSER_BROWSING_DATA_AUTOFILL_COUNTER_H_
diff --git a/chrome/browser/browsing_data/autofill_counter_browsertest.cc b/chrome/browser/browsing_data/autofill_counter_browsertest.cc
new file mode 100644
index 0000000..0e1e7c8
--- /dev/null
+++ b/chrome/browser/browsing_data/autofill_counter_browsertest.cc
@@ -0,0 +1,401 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/browsing_data/autofill_counter.h"
+
+#include "base/guid.h"
+#include "base/prefs/pref_service.h"
+#include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/threading/platform_thread.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/web_data_service_factory.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "components/autofill/core/browser/autofill_type.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace {
+
+class AutofillCounterTest : public InProcessBrowserTest {
+ public:
+  AutofillCounterTest() {}
+  ~AutofillCounterTest() override {}
+
+  void SetUpOnMainThread() override {
+    web_data_service_ = WebDataServiceFactory::GetAutofillWebDataForProfile(
+        browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS);
+
+    SetAutofillDeletionPref(true);
+    SetDeletionPeriodPref(BrowsingDataRemover::EVERYTHING);
+  }
+
+  // Autocomplete suggestions --------------------------------------------------
+
+  void AddAutocompleteSuggestion(const std::string& name,
+                                 const std::string& value) {
+    autofill::FormFieldData field;
+    field.name = base::ASCIIToUTF16(name);
+    field.value = base::ASCIIToUTF16(value);
+
+    std::vector<autofill::FormFieldData> form_fields;
+    form_fields.push_back(field);
+    web_data_service_->AddFormFields(form_fields);
+  }
+
+  void RemoveAutocompleteSuggestion(const std::string& name,
+                                    const std::string& value) {
+    web_data_service_->RemoveFormValueForElementName(
+        base::ASCIIToUTF16(name),
+        base::ASCIIToUTF16(value));
+  }
+
+  void ClearAutocompleteSuggestions() {
+    web_data_service_->RemoveFormElementsAddedBetween(
+        base::Time(), base::Time::Max());
+  }
+
+  // Credit cards --------------------------------------------------------------
+
+  void AddCreditCard(const std::string& card_number,
+                     int exp_month,
+                     int exp_year) {
+    autofill::CreditCard card(
+        base::ASCIIToUTF16(card_number), exp_month, exp_year);
+    std::string id = base::GenerateGUID();
+    credit_card_ids_.push_back(id);
+    card.set_guid(id);
+    web_data_service_->AddCreditCard(card);
+  }
+
+  void RemoveLastCreditCard() {
+    web_data_service_->RemoveCreditCard(credit_card_ids_.back());
+    credit_card_ids_.pop_back();
+  }
+
+  // Addresses -----------------------------------------------------------------
+
+  void AddAddress(const std::string& name,
+                  const std::string& surname,
+                  const std::string& address) {
+    autofill::AutofillProfile profile;
+    std::string id = base::GenerateGUID();
+    address_ids_.push_back(id);
+    profile.set_guid(id);
+    profile.SetInfo(autofill::AutofillType(autofill::NAME_FIRST),
+                    base::ASCIIToUTF16(name), "en-US");
+    profile.SetInfo(autofill::AutofillType(autofill::NAME_LAST),
+                    base::ASCIIToUTF16(surname), "en-US");
+    profile.SetInfo(autofill::AutofillType(autofill::ADDRESS_HOME_LINE1),
+                    base::ASCIIToUTF16(address), "en-US");
+    web_data_service_->AddAutofillProfile(profile);
+  }
+
+  void RemoveLastAddress() {
+    web_data_service_->RemoveAutofillProfile(address_ids_.back());
+    address_ids_.pop_back();
+  }
+
+  // Other autofill utils ------------------------------------------------------
+
+  void ClearCreditCardsAndAddresses() {
+    web_data_service_->RemoveAutofillDataModifiedBetween(
+        base::Time(), base::Time::Max());
+  }
+
+  void CallbackFromDBThread() {
+    content::BrowserThread::PostTask(
+        content::BrowserThread::UI, FROM_HERE,
+        base::Bind(&base::RunLoop::Quit,
+                   base::Unretained(run_loop_.get())));
+  }
+
+  void WaitForDBThread() {
+    run_loop_.reset(new base::RunLoop());
+
+    content::BrowserThread::PostTask(
+        content::BrowserThread::DB, FROM_HERE,
+        base::Bind(&AutofillCounterTest::CallbackFromDBThread,
+                   base::Unretained(this)));
+
+    run_loop_->Run();
+  }
+
+  // Other utils ---------------------------------------------------------------
+
+  void SetAutofillDeletionPref(bool value) {
+    browser()->profile()->GetPrefs()->SetBoolean(prefs::kDeleteFormData, value);
+  }
+
+  void SetDeletionPeriodPref(BrowsingDataRemover::TimePeriod period) {
+    browser()->profile()->GetPrefs()->SetInteger(
+        prefs::kDeleteTimePeriod, static_cast<int>(period));
+  }
+
+  // Callback and result retrieval ---------------------------------------------
+
+  void WaitForCounting() {
+    run_loop_.reset(new base::RunLoop());
+    run_loop_->Run();
+  }
+
+  BrowsingDataCounter::ResultInt GetNumSuggestions() {
+    DCHECK(finished_);
+    return num_suggestions_;
+  }
+
+  BrowsingDataCounter::ResultInt GetNumCreditCards() {
+    DCHECK(finished_);
+    return num_credit_cards_;
+  }
+
+  BrowsingDataCounter::ResultInt GetNumAddresses() {
+    DCHECK(finished_);
+    return num_addresses_;
+  }
+
+  void Callback(scoped_ptr<BrowsingDataCounter::Result> result) {
+    finished_ = result->Finished();
+
+    if (finished_) {
+      AutofillCounter::AutofillResult* autofill_result =
+          static_cast<AutofillCounter::AutofillResult*>(result.get());
+
+      num_suggestions_ = autofill_result->Value();
+      num_credit_cards_ = autofill_result->num_credit_cards();
+      num_addresses_ = autofill_result->num_addresses();
+    }
+
+    if (run_loop_ && finished_)
+      run_loop_->Quit();
+  }
+
+ private:
+  scoped_ptr<base::RunLoop> run_loop_;
+
+  std::vector<std::string> credit_card_ids_;
+  std::vector<std::string> address_ids_;
+
+  scoped_refptr<autofill::AutofillWebDataService> web_data_service_;
+
+  bool finished_;
+  BrowsingDataCounter::ResultInt num_suggestions_;
+  BrowsingDataCounter::ResultInt num_credit_cards_;
+  BrowsingDataCounter::ResultInt num_addresses_;
+
+  DISALLOW_COPY_AND_ASSIGN(AutofillCounterTest);
+};
+
+// Tests that the counter does not count when the form data deletion preference
+// is false.
+IN_PROC_BROWSER_TEST_F(AutofillCounterTest, PrefIsFalse) {
+  SetAutofillDeletionPref(false);
+
+  AutofillCounter counter;
+  counter.Init(browser()->profile(),
+               base::Bind(&AutofillCounterTest::Callback,
+                          base::Unretained(this)));
+  counter.Restart();
+
+  EXPECT_FALSE(counter.HasPendingQuery());
+}
+
+// Tests that we count the correct number of autocomplete suggestions.
+IN_PROC_BROWSER_TEST_F(AutofillCounterTest, AutocompleteSuggestions) {
+  AutofillCounter counter;
+  counter.Init(browser()->profile(),
+               base::Bind(&AutofillCounterTest::Callback,
+                          base::Unretained(this)));
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(0, GetNumSuggestions());
+
+  AddAutocompleteSuggestion("email", "example@example.com");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(1, GetNumSuggestions());
+
+  AddAutocompleteSuggestion("tel", "+123456789");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(2, GetNumSuggestions());
+
+  AddAutocompleteSuggestion("tel", "+987654321");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(3, GetNumSuggestions());
+
+  RemoveAutocompleteSuggestion("email", "example@example.com");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(2, GetNumSuggestions());
+
+  ClearAutocompleteSuggestions();
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(0, GetNumSuggestions());
+}
+
+// Tests that we count the correct number of credit cards.
+IN_PROC_BROWSER_TEST_F(AutofillCounterTest, CreditCards) {
+  AutofillCounter counter;
+  counter.Init(browser()->profile(),
+               base::Bind(&AutofillCounterTest::Callback,
+                          base::Unretained(this)));
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(0, GetNumCreditCards());
+
+  AddCreditCard("0000-0000-0000-0000", 1, 2015);
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(1, GetNumCreditCards());
+
+  AddCreditCard("0123-4567-8910-1112", 10, 2015);
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(2, GetNumCreditCards());
+
+  AddCreditCard("1211-1098-7654-3210", 10, 2030);
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(3, GetNumCreditCards());
+
+  RemoveLastCreditCard();
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(2, GetNumCreditCards());
+
+  ClearCreditCardsAndAddresses();
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(0, GetNumCreditCards());
+}
+
+// Tests that we count the correct number of addresses.
+IN_PROC_BROWSER_TEST_F(AutofillCounterTest, Addresses) {
+  AutofillCounter counter;
+  counter.Init(browser()->profile(),
+               base::Bind(&AutofillCounterTest::Callback,
+                          base::Unretained(this)));
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(0, GetNumAddresses());
+
+  AddAddress("John", "Doe", "Main Street 12345");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(1, GetNumAddresses());
+
+  AddAddress("Jane", "Smith", "Main Street 12346");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(2, GetNumAddresses());
+
+  AddAddress("John", "Smith", "Side Street 47");
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(3, GetNumAddresses());
+
+  RemoveLastAddress();
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(2, GetNumAddresses());
+
+  ClearCreditCardsAndAddresses();
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(0, GetNumAddresses());
+}
+
+// Tests that we return the correct complex result when counting more than
+// one type of items.
+IN_PROC_BROWSER_TEST_F(AutofillCounterTest, ComplexResult) {
+  AddAutocompleteSuggestion("email", "example@example.com");
+  AddAutocompleteSuggestion("zip", "12345");
+  AddAutocompleteSuggestion("tel", "+123456789");
+  AddAutocompleteSuggestion("tel", "+987654321");
+  AddAutocompleteSuggestion("city", "Munich");
+
+  AddCreditCard("0000-0000-0000-0000", 1, 2015);
+  AddCreditCard("1211-1098-7654-3210", 10, 2030);
+
+  AddAddress("John", "Doe", "Main Street 12345");
+  AddAddress("Jane", "Smith", "Main Street 12346");
+  AddAddress("John", "Smith", "Side Street 47");
+
+  AutofillCounter counter;
+  counter.Init(browser()->profile(),
+               base::Bind(&AutofillCounterTest::Callback,
+                          base::Unretained(this)));
+  counter.Restart();
+  WaitForCounting();
+  EXPECT_EQ(5, GetNumSuggestions());
+  EXPECT_EQ(2, GetNumCreditCards());
+  EXPECT_EQ(3, GetNumAddresses());
+}
+
+// Tests that the counting respects time ranges.
+IN_PROC_BROWSER_TEST_F(AutofillCounterTest, TimeRanges) {
+  // This test makes time comparisons that are precise to a microsecond, but the
+  // database uses the time_t format which is only precise to a second.
+  // Make sure we use timestamps rounded to a second.
+  base::Time time1 = base::Time::FromTimeT(base::Time::Now().ToTimeT());
+
+  AddAutocompleteSuggestion("email", "example@example.com");
+  AddCreditCard("0000-0000-0000-0000", 1, 2015);
+  AddAddress("John", "Doe", "Main Street 12345");
+  WaitForDBThread();
+
+  // Skip at least a second has passed and add another batch.
+  base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
+  base::Time time2 = base::Time::FromTimeT(base::Time::Now().ToTimeT());
+
+  AddCreditCard("0123-4567-8910-1112", 10, 2015);
+  AddAddress("Jane", "Smith", "Main Street 12346");
+  AddAddress("John", "Smith", "Side Street 47");
+  WaitForDBThread();
+
+  // Skip at least a second has passed and add another batch.
+  base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
+  base::Time time3 = base::Time::FromTimeT(base::Time::Now().ToTimeT());
+
+  AddAutocompleteSuggestion("tel", "+987654321");
+  AddCreditCard("1211-1098-7654-3210", 10, 2030);
+  WaitForDBThread();
+
+  // Test the results for different starting points.
+  struct TestCase {
+    const base::Time period_start;
+    const BrowsingDataCounter::ResultInt expected_num_suggestions;
+    const BrowsingDataCounter::ResultInt expected_num_credit_cards;
+    const BrowsingDataCounter::ResultInt expected_num_addresses;
+  } test_cases[] = {
+    { base::Time(), 2, 3, 3},
+    { time1,        2, 3, 3},
+    { time2,        1, 2, 2},
+    { time3,        1, 1, 0}
+  };
+
+  AutofillCounter counter;
+  counter.Init(browser()->profile(),
+               base::Bind(&AutofillCounterTest::Callback,
+                          base::Unretained(this)));
+
+  for (const TestCase& test_case : test_cases) {
+    counter.SetPeriodStartForTesting(test_case.period_start);
+    counter.Restart();
+    WaitForCounting();
+    EXPECT_EQ(test_case.expected_num_suggestions, GetNumSuggestions());
+    EXPECT_EQ(test_case.expected_num_credit_cards, GetNumCreditCards());
+    EXPECT_EQ(test_case.expected_num_addresses, GetNumAddresses());
+  }
+}
+
+}  // namespace
diff --git a/chrome/browser/browsing_data/history_counter.cc b/chrome/browser/browsing_data/history_counter.cc
index 116dba92..bad51a2a 100644
--- a/chrome/browser/browsing_data/history_counter.cc
+++ b/chrome/browser/browsing_data/history_counter.cc
@@ -9,7 +9,9 @@
 #include "chrome/browser/browsing_data/history_counter.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history/web_history_service_factory.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/pref_names.h"
+#include "components/browser_sync/browser/profile_sync_service.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/web_history_service.h"
 #include "content/public/browser/browser_thread.h"
@@ -22,10 +24,22 @@
                                    has_synced_visits_(false),
                                    local_counting_finished_(false),
                                    web_counting_finished_(false),
-                                   testing_web_history_service_(nullptr) {
+                                   testing_web_history_service_(nullptr),
+                                   sync_service_(nullptr),
+                                   history_sync_enabled_(false) {
 }
 
 HistoryCounter::~HistoryCounter() {
+  DCHECK(sync_service_);
+  sync_service_->RemoveObserver(this);
+}
+
+void HistoryCounter::OnInitialized() {
+  sync_service_ = ProfileSyncServiceFactory::GetForProfile(GetProfile());
+  DCHECK(sync_service_);
+  sync_service_->AddObserver(this);
+  history_sync_enabled_ =
+      !!WebHistoryServiceFactory::GetForProfile(GetProfile());
 }
 
 const std::string& HistoryCounter::GetPrefName() const {
@@ -163,3 +177,15 @@
 
 HistoryCounter::HistoryResult::~HistoryResult() {
 }
+
+void HistoryCounter::OnStateChanged() {
+  bool history_sync_enabled_new_state =
+      !!WebHistoryServiceFactory::GetForProfile(GetProfile());
+
+  // If the history sync was just enabled or disabled, restart the counter
+  // so that we update the result accordingly.
+  if (history_sync_enabled_ != history_sync_enabled_new_state) {
+    history_sync_enabled_ = history_sync_enabled_new_state;
+    Restart();
+  }
+}
diff --git a/chrome/browser/browsing_data/history_counter.h b/chrome/browser/browsing_data/history_counter.h
index 4061cdb..026da3a8 100644
--- a/chrome/browser/browsing_data/history_counter.h
+++ b/chrome/browser/browsing_data/history_counter.h
@@ -10,8 +10,12 @@
 #include "chrome/browser/browsing_data/browsing_data_counter.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/web_history_service.h"
+#include "components/sync_driver/sync_service_observer.h"
 
-class HistoryCounter: public BrowsingDataCounter {
+class ProfileSyncService;
+
+class HistoryCounter: public BrowsingDataCounter,
+                      public sync_driver::SyncServiceObserver {
  public:
   class HistoryResult : public FinishedResult {
    public:
@@ -29,6 +33,7 @@
   HistoryCounter();
   ~HistoryCounter() override;
 
+  void OnInitialized() override;
   const std::string& GetPrefName() const override;
 
   // Whether there are counting tasks in progress. Only used for testing.
@@ -55,6 +60,9 @@
 
   base::ThreadChecker thread_checker_;
 
+  ProfileSyncService* sync_service_;
+  bool history_sync_enabled_;
+
   void Count() override;
 
   void OnGetLocalHistoryCount(history::HistoryCountResult result);
@@ -62,6 +70,9 @@
                             const base::DictionaryValue* result);
   void OnWebHistoryTimeout();
   void MergeResults();
+
+  // SyncServiceObserver implementation.
+  void OnStateChanged() override;
 };
 
 #endif  // CHROME_BROWSER_BROWSING_DATA_HISTORY_COUNTER_H_
diff --git a/chrome/browser/browsing_data/history_counter_browsertest.cc b/chrome/browser/browsing_data/history_counter_browsertest.cc
index da58f67..24b3ff3 100644
--- a/chrome/browser/browsing_data/history_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/history_counter_browsertest.cc
@@ -11,9 +11,9 @@
 #include "chrome/browser/history/web_history_service_factory.h"
 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
 #include "chrome/browser/signin/signin_manager_factory.h"
+#include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/test/base/in_process_browser_test.h"
 #include "components/browser_sync/browser/profile_sync_service.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/web_history_service.h"
@@ -25,8 +25,17 @@
 
 namespace {
 
-class HistoryCounterTest : public InProcessBrowserTest {
+class HistoryCounterTest : public SyncTest {
  public:
+  HistoryCounterTest() : SyncTest(SINGLE_CLIENT) {
+    // TODO(msramek): Only one of the test cases, RestartOnSyncChange, is a Sync
+    // integration test. Extract it and move it to the rest of integration tests
+    // in chrome/browser/sync/test/integration/. Change this class back to
+    // InProcessBrowserTest.
+  }
+
+  ~HistoryCounterTest() override {};
+
   void SetUpOnMainThread() override {
     time_ = base::Time::Now();
     service_ = HistoryServiceFactory::GetForProfileWithoutCreating(
@@ -87,6 +96,20 @@
       run_loop_->Quit();
   }
 
+  bool CountingFinishedSinceLastAsked() {
+    bool result = finished_;
+    finished_ = false;
+    return result;
+  }
+
+  void WaitForCountingOrConfirmFinished() {
+    if (CountingFinishedSinceLastAsked())
+      return;
+
+    WaitForCounting();
+    CountingFinishedSinceLastAsked();
+  }
+
  private:
   scoped_ptr<base::RunLoop> run_loop_;
   history::HistoryService* service_;
@@ -341,8 +364,9 @@
 
 // Test the behavior for a profile that syncs history.
 IN_PROC_BROWSER_TEST_F(HistoryCounterTest, Synced) {
-  // WebHistoryService makes network requests, so we need use a fake one
+  // WebHistoryService makes network requests, so we need to use a fake one
   // for testing.
+  // TODO(msramek): Move this to a separate file, next to WebHistoryService.
   scoped_ptr<FakeWebHistoryService> service(
       new FakeWebHistoryService(browser()->profile()));
 
@@ -415,4 +439,81 @@
   EXPECT_FALSE(HasSyncedVisits());
 }
 
+// Test that the counting restarts when history sync state changes.
+// TODO(crbug.com/553421): Enable this test and move it to the
+// sync/test/integration directory.
+IN_PROC_BROWSER_TEST_F(HistoryCounterTest, DISABLED_RestartOnSyncChange) {
+  // Set up the Sync client.
+  ASSERT_TRUE(SetupClients());
+  static const int kFirstProfileIndex = 0;
+  ProfileSyncService* sync_service = GetSyncService(kFirstProfileIndex);
+  Profile* profile = GetProfile(kFirstProfileIndex);
+
+  // Set up the fake web history service and the counter.
+  scoped_ptr<FakeWebHistoryService> web_history_service(
+      new FakeWebHistoryService(profile));
+  HistoryCounter counter;
+  counter.SetWebHistoryServiceForTesting(web_history_service.get());
+  counter.Init(profile,
+               base::Bind(&HistoryCounterTest::Callback,
+                          base::Unretained(this)));
+
+  // Note that some Sync operations notify observers immediately (and thus there
+  // is no need to call |WaitForCounting()|; in fact, it would block the test),
+  // while other operations only post the task on UI thread's message loop
+  // (which requires calling |WaitForCounting()| for them to run). Therefore,
+  // this test always checks if the callback has already run and only waits
+  // if it has not.
+
+  // We sync all datatypes by default, so starting Sync means that we start
+  // syncing history deletion, and this should restart the counter.
+  ASSERT_TRUE(SetupSync());
+  ASSERT_TRUE(sync_service->IsSyncActive());
+  ASSERT_TRUE(sync_service->GetPreferredDataTypes().Has(
+      syncer::HISTORY_DELETE_DIRECTIVES));
+  WaitForCountingOrConfirmFinished();
+
+  // We stop syncing history deletion in particular. This restarts the counter.
+  syncer::ModelTypeSet everything_except_history = syncer::ModelTypeSet::All();
+  everything_except_history.Remove(syncer::HISTORY_DELETE_DIRECTIVES);
+  sync_service->SetSetupInProgress(true);
+  sync_service->ChangePreferredDataTypes(everything_except_history);
+  sync_service->SetSetupInProgress(false);
+  WaitForCountingOrConfirmFinished();
+
+  // If the history deletion sync is not affected, the counter is not restarted.
+  syncer::ModelTypeSet only_passwords(syncer::PASSWORDS);
+  sync_service->ChangePreferredDataTypes(only_passwords);
+  sync_service->SetSetupInProgress(true);
+  sync_service->ChangePreferredDataTypes(only_passwords);
+  sync_service->SetSetupInProgress(false);
+  EXPECT_FALSE(counter.HasTrackedTasks());
+  EXPECT_FALSE(CountingFinishedSinceLastAsked());
+
+  // Same in this case.
+  syncer::ModelTypeSet autofill_and_passwords(
+      syncer::AUTOFILL, syncer::PASSWORDS);
+  sync_service->SetSetupInProgress(true);
+  sync_service->ChangePreferredDataTypes(autofill_and_passwords);
+  sync_service->SetSetupInProgress(false);
+  EXPECT_FALSE(counter.HasTrackedTasks());
+  EXPECT_FALSE(CountingFinishedSinceLastAsked());
+
+  // We start syncing history deletion again. This restarts the counter.
+  sync_service->SetSetupInProgress(true);
+  sync_service->ChangePreferredDataTypes(syncer::ModelTypeSet::All());
+  sync_service->SetSetupInProgress(false);
+  WaitForCountingOrConfirmFinished();
+
+  // Changing the syncing datatypes to another set that still includes history
+  // deletion should technically not trigger a restart, because the state of
+  // history deletion did not change. However, in reality we can get two
+  // notifications, one that history sync has stopped and another that it is
+  // active again.
+
+  // Stopping the Sync service triggers a restart.
+  sync_service->RequestStop(sync_driver::SyncService::CLEAR_DATA);
+  WaitForCountingOrConfirmFinished();
+}
+
 }  // namespace
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index cb3ca1d..fb18e51d 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -63,6 +63,7 @@
 #include "chrome/browser/memory/tab_manager.h"
 #include "chrome/browser/metrics/field_trial_synchronizer.h"
 #include "chrome/browser/metrics/thread_watcher.h"
+#include "chrome/browser/mojo_runner_util.h"
 #include "chrome/browser/nacl_host/nacl_browser_delegate_impl.h"
 #include "chrome/browser/net/crl_set_fetcher.h"
 #include "chrome/browser/performance_monitor/performance_monitor.h"
@@ -117,7 +118,7 @@
 #include "components/nacl/browser/nacl_browser.h"
 #include "components/rappor/rappor_service.h"
 #include "components/signin/core/common/profile_management_switches.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "components/tracing/tracing_switches.h"
 #include "components/translate/content/browser/browser_cld_utils.h"
 #include "components/translate/content/common/cld_data_source.h"
@@ -247,6 +248,10 @@
 #include "components/webusb/webusb_detector.h"
 #endif
 
+#if defined(MOJO_RUNNER_CLIENT)
+#include "chrome/browser/mojo_runner_state.h"
+#endif
+
 using content::BrowserThread;
 
 namespace {
@@ -1212,6 +1217,13 @@
   SCOPED_UMA_HISTOGRAM_LONG_TIMER("Startup.PreMainMessageLoopRunImplLongTime");
   const base::TimeTicks start_time_step1 = base::TimeTicks::Now();
 
+#if defined(MOJO_RUNNER_CLIENT)
+  if (IsRunningInMojoRunner()) {
+    mojo_runner_state_.reset(new MojoRunnerState);
+    mojo_runner_state_->WaitForConnection();
+  }
+#endif  // defined(MOJO_RUNNER_CLIENT)
+
 #if defined(OS_WIN)
   // Windows parental controls calls can be slow, so we do an early init here
   // that calculates this value off of the UI thread.
diff --git a/chrome/browser/chrome_browser_main.h b/chrome/browser/chrome_browser_main.h
index 140a960..bc3face 100644
--- a/chrome/browser/chrome_browser_main.h
+++ b/chrome/browser/chrome_browser_main.h
@@ -23,6 +23,7 @@
 class ChromeBrowserMainExtraParts;
 class FieldTrialSynchronizer;
 class MetricsService;
+class MojoRunnerState;
 class PrefService;
 class ProcessPowerCollector;
 class Profile;
@@ -191,6 +192,10 @@
   // Members needed across shutdown methods.
   bool restart_last_session_;
 
+#if defined(MOJO_RUNNER_CLIENT)
+  scoped_ptr<MojoRunnerState> mojo_runner_state_;
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainParts);
 };
 
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index c576fe0..77d2809 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -51,11 +51,11 @@
     "//chrome/browser/extensions",
     "//chrome/browser/safe_browsing:chunk_proto",
     "//chrome/browser/safe_browsing:metadata_proto",
-    "//chrome/browser/safe_browsing:report_proto",
     "//chrome/common",
     "//chrome/common/extensions/api",
     "//chrome/common/extensions/api:api_registration",
     "//chrome/common/net",
+    "//chrome/common/safe_browsing:proto",
     "//chrome/installer/util",
     "//chromeos",
     "//chromeos/ime:gencode",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 7f57fa40..490b417 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -674,6 +674,8 @@
 }
 
 void ChromeBrowserMainPartsChromeos::PostBrowserStart() {
+  system::InputDeviceSettings::Get()->InitTouchDevicesStatusFromLocalPrefs();
+
   // These are dependent on the ash::Shell singleton already having been
   // initialized.
   // TODO(oshima): Remove ash dependency in PowerButtonObserver.
diff --git a/chrome/browser/chromeos/drive/file_system_util.cc b/chrome/browser/chromeos/drive/file_system_util.cc
index adb80d2..6bb95b8 100644
--- a/chrome/browser/chromeos/drive/file_system_util.cc
+++ b/chrome/browser/chromeos/drive/file_system_util.cc
@@ -127,9 +127,9 @@
 
   // |profile_id| needs to be checked with ProfileManager::IsValidProfile
   // before using it.
-  Profile* profile = reinterpret_cast<Profile*>(profile_id);
-  if (!g_browser_process->profile_manager()->IsValidProfile(profile))
+  if (!g_browser_process->profile_manager()->IsValidProfile(profile_id))
     return NULL;
+  Profile* profile = reinterpret_cast<Profile*>(profile_id);
   return GetFileSystemByProfile(profile);
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index 4874c72..9c0b33b 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -119,9 +119,9 @@
 
   // |profile_id| needs to be checked with ProfileManager::IsValidProfile
   // before using it.
-  Profile* profile = reinterpret_cast<Profile*>(profile_id);
-  if (!g_browser_process->profile_manager()->IsValidProfile(profile))
+  if (!g_browser_process->profile_manager()->IsValidProfile(profile_id))
     return NULL;
+  Profile* profile = reinterpret_cast<Profile*>(profile_id);
 
   return file_manager::EventRouterFactory::GetForProfile(profile);
 }
diff --git a/chrome/browser/chromeos/file_manager/gallery_browsertest.cc b/chrome/browser/chromeos/file_manager/gallery_browsertest.cc
index dae943c..5bdebfd 100644
--- a/chrome/browser/chromeos/file_manager/gallery_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/gallery_browsertest.cc
@@ -67,6 +67,20 @@
   StartTest();
 }
 
+#if defined(DISABLE_SLOW_FILESAPP_TESTS)
+#define MAYBE_OpenMultipleImagesAndSwitchToSlideModeOnDownloads \
+  DISABLED_OpenMultipleImagesAndSwitchToSlideModeOnDownloads
+#else
+#define MAYBE_OpenMultipleImagesAndSwitchToSlideModeOnDownloads \
+  OpenMultipleImagesAndSwitchToSlideModeOnDownloads
+#endif
+IN_PROC_BROWSER_TEST_F(
+    GalleryBrowserTest,
+    MAYBE_OpenMultipleImagesAndSwitchToSlideModeOnDownloads) {
+  set_test_case_name("openMultipleImagesAndChangeToSlideModeOnDownloads");
+  StartTest();
+}
+
 // http://crbug.com/508949
 #if defined(MEMORY_SANITIZER)
 #define MAYBE_OpenMultipleImagesOnDrive DISABLED_OpenMultipleImagesOnDrive
diff --git a/chrome/browser/chromeos/fileapi/external_file_url_request_job.cc b/chrome/browser/chromeos/fileapi/external_file_url_request_job.cc
index 4abe494..c714b60 100644
--- a/chrome/browser/chromeos/fileapi/external_file_url_request_job.cc
+++ b/chrome/browser/chromeos/fileapi/external_file_url_request_job.cc
@@ -10,7 +10,6 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
 #include "chrome/browser/chromeos/fileapi/external_file_url_util.h"
@@ -20,6 +19,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/url_constants.h"
+#include "net/base/net_errors.h"
 #include "net/http/http_byte_range.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_info.h"
@@ -65,11 +65,11 @@
  private:
   void RunOnUIThread(Lifetime lifetime) {
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
-    Profile* const profile = reinterpret_cast<Profile*>(profile_id_);
-    if (!g_browser_process->profile_manager()->IsValidProfile(profile)) {
+    if (!g_browser_process->profile_manager()->IsValidProfile(profile_id_)) {
       ReplyResult(net::ERR_FAILED);
       return;
     }
+    Profile* const profile = reinterpret_cast<Profile*>(profile_id_);
     content::StoragePartition* const storage =
         content::BrowserContext::GetStoragePartitionForSite(profile, url_);
     DCHECK(storage);
@@ -163,7 +163,6 @@
     net::NetworkDelegate* network_delegate)
     : net::URLRequestJob(request, network_delegate),
       profile_id_(profile_id),
-      range_parse_result_(net::OK),
       remaining_bytes_(0),
       weak_ptr_factory_(this) {}
 
@@ -171,40 +170,24 @@
     const net::HttpRequestHeaders& headers) {
   std::string range_header;
   if (headers.GetHeader(net::HttpRequestHeaders::kRange, &range_header)) {
-    // Currently this job only cares about the Range header, and only supports
-    // single range requests. Note that validation is deferred to Start,
-    // because NotifyStartError is not legal to call since the job has not
-    // started.
+    // Note: We only support single range requests.
     std::vector<net::HttpByteRange> ranges;
     if (net::HttpUtil::ParseRangeHeader(range_header, &ranges) &&
         ranges.size() == 1) {
       byte_range_ = ranges[0];
     } else {
-      range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
+      // Failed to parse Range: header, so notify the error.
+      NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                       net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     }
   }
 }
 
 void ExternalFileURLRequestJob::Start() {
-  // Post a task to invoke StartAsync asynchronously to avoid re-entering the
-  // delegate, because NotifyStartError is not legal to call synchronously in
-  // Start().
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&ExternalFileURLRequestJob::StartAsync,
-                            weak_ptr_factory_.GetWeakPtr()));
-}
-
-void ExternalFileURLRequestJob::StartAsync() {
   DVLOG(1) << "Starting request";
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(!stream_reader_);
 
-  if (range_parse_result_ != net::OK) {
-    NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                           range_parse_result_));
-    return;
-  }
-
   // We only support GET request.
   if (request()->method() != "GET") {
     LOG(WARNING) << "Failed to start request: " << request()->method()
@@ -342,23 +325,37 @@
   return true;
 }
 
-int ExternalFileURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
+bool ExternalFileURLRequestJob::ReadRawData(net::IOBuffer* buf,
+                                            int buf_size,
+                                            int* bytes_read) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(stream_reader_);
 
-  if (remaining_bytes_ == 0)
-    return 0;
+  if (remaining_bytes_ == 0) {
+    *bytes_read = 0;
+    return true;
+  }
 
   const int result = stream_reader_->Read(
       buf, std::min<int64>(buf_size, remaining_bytes_),
       base::Bind(&ExternalFileURLRequestJob::OnReadCompleted,
                  weak_ptr_factory_.GetWeakPtr()));
 
-  if (result < 0)
-    return result;
+  if (result == net::ERR_IO_PENDING) {
+    // The data is not yet available.
+    SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+    return false;
+  }
+  if (result < 0) {
+    // An error occurs.
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+    return false;
+  }
 
+  // Reading has been finished immediately.
+  *bytes_read = result;
   remaining_bytes_ -= result;
-  return result;
+  return true;
 }
 
 ExternalFileURLRequestJob::~ExternalFileURLRequestJob() {
@@ -367,10 +364,15 @@
 void ExternalFileURLRequestJob::OnReadCompleted(int read_result) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
-  if (read_result > 0)
-    remaining_bytes_ -= read_result;
+  if (read_result < 0) {
+    DCHECK_NE(read_result, net::ERR_IO_PENDING);
+    NotifyDone(
+        net::URLRequestStatus(net::URLRequestStatus::FAILED, read_result));
+  }
 
-  ReadRawDataComplete(read_result);
+  remaining_bytes_ -= read_result;
+  SetStatus(net::URLRequestStatus());  // Clear the IO_PENDING status.
+  NotifyReadComplete(read_result);
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/fileapi/external_file_url_request_job.h b/chrome/browser/chromeos/fileapi/external_file_url_request_job.h
index dff3379b..a026e43 100644
--- a/chrome/browser/chromeos/fileapi/external_file_url_request_job.h
+++ b/chrome/browser/chromeos/fileapi/external_file_url_request_job.h
@@ -63,17 +63,12 @@
   void Kill() override;
   bool GetMimeType(std::string* mime_type) const override;
   bool IsRedirectResponse(GURL* location, int* http_status_code) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
 
  protected:
   ~ExternalFileURLRequestJob() override;
 
  private:
-  // Helper method to start the job. Should be called asynchronously because
-  // NotifyStartError() is not legal to call synchronously in
-  // URLRequestJob::Start().
-  void StartAsync();
-
   // Called from an internal helper class defined in drive_url_request_job.cc,
   // which is running on the UI thread.
   void OnHelperResultObtained(
@@ -96,7 +91,6 @@
   void* const profile_id_;
 
   // The range of the file to be returned.
-  net::Error range_parse_result_;
   net::HttpByteRange byte_range_;
   int64 remaining_bytes_;
 
diff --git a/chrome/browser/chromeos/login/helper.cc b/chrome/browser/chromeos/login/helper.cc
index 69696fc..9db91de 100644
--- a/chrome/browser/chromeos/login/helper.cc
+++ b/chrome/browser/chromeos/login/helper.cc
@@ -15,6 +15,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/network/managed_network_configuration_handler.h"
+#include "chromeos/network/network_connection_handler.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
@@ -128,8 +129,10 @@
   return base::string16();
 }
 
-void NetworkStateHelper::CreateNetworkFromOnc(
-    const std::string& onc_spec) const {
+void NetworkStateHelper::CreateAndConnectNetworkFromOnc(
+    const std::string& onc_spec,
+    const base::Closure& success_callback,
+    const base::Closure& error_callback) const {
   std::string error;
   scoped_ptr<base::Value> root = base::JSONReader::ReadAndReturnError(
       onc_spec, base::JSON_ALLOW_TRAILING_COMMAS, nullptr, &error);
@@ -140,24 +143,14 @@
     return;
   }
 
-  NetworkHandler::Get()->managed_network_configuration_handler()->
-      CreateConfiguration(
+  NetworkHandler::Get()
+      ->managed_network_configuration_handler()
+      ->CreateConfiguration(
           "", *toplevel_onc,
           base::Bind(&NetworkStateHelper::OnCreateConfiguration,
-                     base::Unretained(this)),
-          base::Bind(&NetworkStateHelper::OnCreateConfigurationFailed,
-                     base::Unretained(this)));
-}
-
-void NetworkStateHelper::OnCreateConfiguration(
-    const std::string& service_path) const {
-  // Do Nothing.
-}
-
-void NetworkStateHelper::OnCreateConfigurationFailed(
-    const std::string& error_name,
-    scoped_ptr<base::DictionaryValue> error_data) const {
-  LOG(ERROR) << "Failed to create network configuration: " << error_name;
+                     base::Unretained(this), success_callback, error_callback),
+          base::Bind(&NetworkStateHelper::OnCreateOrConnectNetworkFailed,
+                     base::Unretained(this), error_callback));
 }
 
 bool NetworkStateHelper::IsConnected() const {
@@ -174,6 +167,26 @@
       chromeos::NetworkTypePattern::Default()) != nullptr;
 }
 
+void NetworkStateHelper::OnCreateConfiguration(
+    const base::Closure& success_callback,
+    const base::Closure& error_callback,
+    const std::string& service_path) const {
+  // Connect to the network.
+  NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork(
+      service_path, success_callback,
+      base::Bind(&NetworkStateHelper::OnCreateOrConnectNetworkFailed,
+                 base::Unretained(this), error_callback),
+      false);
+}
+
+void NetworkStateHelper::OnCreateOrConnectNetworkFailed(
+    const base::Closure& error_callback,
+    const std::string& error_name,
+    scoped_ptr<base::DictionaryValue> error_data) const {
+  LOG(ERROR) << "Failed to create or connect to network: " << error_name;
+  error_callback.Run();
+}
+
 content::StoragePartition* GetSigninPartition() {
   content::WebContents* embedder = GetLoginWebContents();
   if (!embedder)
diff --git a/chrome/browser/chromeos/login/helper.h b/chrome/browser/chromeos/login/helper.h
index c02cd5890..f25eec7 100644
--- a/chrome/browser/chromeos/login/helper.h
+++ b/chrome/browser/chromeos/login/helper.h
@@ -64,8 +64,11 @@
   // Ethernet > WiFi > Cellular. Same for connecting network.
   virtual base::string16 GetCurrentNetworkName() const;
 
-  // Add a network configuration.
-  virtual void CreateNetworkFromOnc(const std::string& onc_spec) const;
+  // Add and apply a network configuration. Used in shark/remora mode.
+  virtual void CreateAndConnectNetworkFromOnc(
+      const std::string& onc_spec,
+      const base::Closure& success_callback,
+      const base::Closure& error_callback) const;
 
   // Returns true if the default network is in connected state.
   virtual bool IsConnected() const;
@@ -74,8 +77,11 @@
   virtual bool IsConnecting() const;
 
  private:
-  void OnCreateConfiguration(const std::string& service_path) const;
-  void OnCreateConfigurationFailed(
+  void OnCreateConfiguration(const base::Closure& success_callback,
+                             const base::Closure& error_callback,
+                             const std::string& service_path) const;
+  void OnCreateOrConnectNetworkFailed(
+      const base::Closure& error_callback,
       const std::string& error_name,
       scoped_ptr<base::DictionaryValue> error_data) const;
 
diff --git a/chrome/browser/chromeos/login/screens/controller_pairing_screen.cc b/chrome/browser/chromeos/login/screens/controller_pairing_screen.cc
index 8fd8d0d..427d164 100644
--- a/chrome/browser/chromeos/login/screens/controller_pairing_screen.cc
+++ b/chrome/browser/chromeos/login/screens/controller_pairing_screen.cc
@@ -101,8 +101,10 @@
       break;
     }
     case ControllerPairingController::STAGE_PAIRING_DONE: {
-      if (delegate_)
+      if (delegate_) {
+        delegate_->SetHostNetwork();
         delegate_->SetHostConfiguration();
+      }
       break;
     }
     case ControllerPairingController::STAGE_HOST_UPDATE_IN_PROGRESS: {
diff --git a/chrome/browser/chromeos/login/screens/controller_pairing_screen.h b/chrome/browser/chromeos/login/screens/controller_pairing_screen.h
index 9ff5323..3fd6376 100644
--- a/chrome/browser/chromeos/login/screens/controller_pairing_screen.h
+++ b/chrome/browser/chromeos/login/screens/controller_pairing_screen.h
@@ -23,6 +23,9 @@
    public:
     virtual ~Delegate() {}
 
+    // Set remora network from shark.
+    virtual void SetHostNetwork() = 0;
+
     // Set remora configuration from shark.
     virtual void SetHostConfiguration() = 0;
   };
diff --git a/chrome/browser/chromeos/login/screens/network_screen.cc b/chrome/browser/chromeos/login/screens/network_screen.cc
index e6c7ca6e..57f858b 100644
--- a/chrome/browser/chromeos/login/screens/network_screen.cc
+++ b/chrome/browser/chromeos/login/screens/network_screen.cc
@@ -4,10 +4,12 @@
 
 #include "chrome/browser/chromeos/login/screens/network_screen.h"
 
+#include "base/json/json_writer.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/prefs/pref_service.h"
 #include "base/strings/string16.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/base/locale_util.h"
@@ -25,7 +27,9 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/network/network_handler.h"
+#include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/network_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -229,8 +233,43 @@
   return timezone_;
 }
 
-void NetworkScreen::CreateNetworkFromOnc(const std::string& onc_spec) {
-  network_state_helper_->CreateNetworkFromOnc(onc_spec);
+void NetworkScreen::GetConnectedWifiNetwork(std::string* out_onc_spec) {
+  // Currently We can only transfer unsecured WiFi configuration from shark to
+  // remora. There is no way to get password for a secured Wifi network in Cros
+  // for security reasons.
+  const NetworkState* network_state =
+      NetworkHandler::Get()->network_state_handler()->ConnectedNetworkByType(
+          NetworkTypePattern::WiFi());
+
+  if (!network_state)
+    return;
+
+  scoped_ptr<base::DictionaryValue> current_onc =
+      network_util::TranslateNetworkStateToONC(network_state);
+  std::string security;
+  current_onc->GetString(
+      onc::network_config::WifiProperty(onc::wifi::kSecurity), &security);
+  if (security != onc::wifi::kSecurityNone)
+    return;
+
+  const std::string hex_ssid = network_state->GetHexSsid();
+
+  scoped_ptr<base::DictionaryValue> copied_onc(new base::DictionaryValue());
+  copied_onc->Set(onc::toplevel_config::kType,
+                  new base::StringValue(onc::network_type::kWiFi));
+  copied_onc->Set(onc::network_config::WifiProperty(onc::wifi::kHexSSID),
+                  new base::StringValue(hex_ssid));
+  copied_onc->Set(onc::network_config::WifiProperty(onc::wifi::kSecurity),
+                  new base::StringValue(security));
+  base::JSONWriter::Write(*copied_onc.get(), out_onc_spec);
+}
+
+void NetworkScreen::CreateAndConnectNetworkFromOnc(
+    const std::string& onc_spec) {
+  network_state_helper_->CreateAndConnectNetworkFromOnc(
+      onc_spec, base::Bind(&base::DoNothing),
+      base::Bind(&NetworkScreen::OnConnectNetworkFromOncFailed,
+                 base::Unretained(this)));
 }
 
 void NetworkScreen::AddObserver(Observer* observer) {
@@ -398,4 +437,13 @@
   GetContextEditor().SetString(kContextKeyTimezone, current_timezone_id);
 }
 
+void NetworkScreen::OnConnectNetworkFromOncFailed() {
+  if (!network_state_helper_->IsConnected() && view_) {
+    // Show error bubble.
+    view_->ShowError(l10n_util::GetStringFUTF16(
+        IDS_NETWORK_SELECTION_ERROR,
+        l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_OS_NAME)));
+  }
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/network_screen.h b/chrome/browser/chromeos/login/screens/network_screen.h
index 749e8a3..4ee03ea 100644
--- a/chrome/browser/chromeos/login/screens/network_screen.h
+++ b/chrome/browser/chromeos/login/screens/network_screen.h
@@ -89,7 +89,10 @@
   void SetTimezone(const std::string& timezone_id);
   std::string GetTimezone() const;
 
-  void CreateNetworkFromOnc(const std::string& onc_spec);
+  // Currently We can only get unsecured Wifi network configuration from shark
+  // that can be applied to remora. Returns the network ONC configuration.
+  void GetConnectedWifiNetwork(std::string* out_onc_spec);
+  void CreateAndConnectNetworkFromOnc(const std::string& onc_spec);
 
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
@@ -151,6 +154,9 @@
   // Callback when the system timezone settings is changed.
   void OnSystemTimezoneChanged();
 
+  // Called when connection the network from ONC failed.
+  void OnConnectNetworkFromOncFailed();
+
   // True if subscribed to network change notification.
   bool is_network_subscribed_;
 
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 2e7d4b0..9b865201 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -1046,14 +1046,24 @@
   return usage_statistics_reporting_;
 }
 
+void WizardController::SetHostNetwork() {
+  if (!shark_controller_)
+    return;
+  NetworkScreen* network_screen = NetworkScreen::Get(this);
+  std::string onc_spec;
+  network_screen->GetConnectedWifiNetwork(&onc_spec);
+  if (!onc_spec.empty())
+    shark_controller_->SetHostNetwork(onc_spec);
+}
+
 void WizardController::SetHostConfiguration() {
-  if (shark_controller_) {
-    NetworkScreen* network_screen = NetworkScreen::Get(this);
-    shark_controller_->SetHostConfiguration(
-        true,  // Eula must be accepted before we get this far.
-        network_screen->GetApplicationLocale(), network_screen->GetTimezone(),
-        GetUsageStatisticsReporting(), network_screen->GetInputMethod());
-  }
+  if (!shark_controller_)
+    return;
+  NetworkScreen* network_screen = NetworkScreen::Get(this);
+  shark_controller_->SetHostConfiguration(
+      true,  // Eula must be accepted before we get this far.
+      network_screen->GetApplicationLocale(), network_screen->GetTimezone(),
+      GetUsageStatisticsReporting(), network_screen->GetInputMethod());
 }
 
 void WizardController::ConfigureHostRequested(
@@ -1076,7 +1086,7 @@
 
 void WizardController::AddNetworkRequested(const std::string& onc_spec) {
   NetworkScreen* network_screen = NetworkScreen::Get(this);
-  network_screen->CreateNetworkFromOnc(onc_spec);
+  network_screen->CreateAndConnectNetworkFromOnc(onc_spec);
 }
 
 void WizardController::OnEnableDebuggingScreenRequested() {
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index eaae940..935014c 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -246,6 +246,7 @@
   bool GetUsageStatisticsReporting() const override;
 
   // Override from ControllerPairingScreen::Delegate:
+  void SetHostNetwork() override;
   void SetHostConfiguration() override;
 
   // Override from HostPairingScreen::Delegate:
diff --git a/chrome/browser/chromeos/system/input_device_settings.cc b/chrome/browser/chromeos/system/input_device_settings.cc
index bb738b5..fd6b6df0 100644
--- a/chrome/browser/chromeos/system/input_device_settings.cc
+++ b/chrome/browser/chromeos/system/input_device_settings.cc
@@ -4,9 +4,12 @@
 
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 
+#include "base/prefs/pref_registry_simple.h"
+#include "base/prefs/pref_service.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
+#include "chrome/common/pref_names.h"
 #include "chromeos/system/statistics_provider.h"
 
 namespace chromeos {
@@ -216,5 +219,55 @@
   return false;
 }
 
+// static
+void InputDeviceSettings::RegisterPrefs(PrefRegistrySimple* registry) {
+  registry->RegisterBooleanPref(::prefs::kTouchScreenEnabled, true);
+  registry->RegisterBooleanPref(::prefs::kTouchPadEnabled, true);
+}
+
+void InputDeviceSettings::InitTouchDevicesStatusFromLocalPrefs() {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+
+  const bool touch_screen_status =
+      local_state->HasPrefPath(::prefs::kTouchScreenEnabled)
+          ? local_state->GetBoolean(::prefs::kTouchScreenEnabled)
+          : true;
+
+  const bool touch_pad_status =
+      local_state->HasPrefPath(::prefs::kTouchPadEnabled)
+          ? local_state->GetBoolean(::prefs::kTouchPadEnabled)
+          : true;
+
+  SetTouchscreensEnabled(touch_screen_status);
+  SetInternalTouchpadEnabled(touch_pad_status);
+}
+
+void InputDeviceSettings::ToggleTouchscreen() {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+
+  const bool touch_screen_status =
+      local_state->HasPrefPath(::prefs::kTouchScreenEnabled)
+          ? local_state->GetBoolean(::prefs::kTouchScreenEnabled)
+          : true;
+
+  local_state->SetBoolean(::prefs::kTouchScreenEnabled, !touch_screen_status);
+  SetTouchscreensEnabled(!touch_screen_status);
+}
+
+void InputDeviceSettings::ToggleTouchpad() {
+  PrefService* local_state = g_browser_process->local_state();
+  DCHECK(local_state);
+
+  const bool touch_pad_status =
+      local_state->HasPrefPath(::prefs::kTouchPadEnabled)
+          ? local_state->GetBoolean(::prefs::kTouchPadEnabled)
+          : true;
+
+  local_state->SetBoolean(::prefs::kTouchPadEnabled, !touch_pad_status);
+  SetInternalTouchpadEnabled(!touch_pad_status);
+}
+
 }  // namespace system
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/system/input_device_settings.h b/chrome/browser/chromeos/system/input_device_settings.h
index 5807e9d..99fa69c 100644
--- a/chrome/browser/chromeos/system/input_device_settings.h
+++ b/chrome/browser/chromeos/system/input_device_settings.h
@@ -9,6 +9,8 @@
 #include "base/logging.h"
 #include "chromeos/chromeos_export.h"
 
+class PrefRegistrySimple;
+
 namespace chromeos {
 namespace system {
 
@@ -165,6 +167,16 @@
   // where other input devices like mouse are absent.
   static bool ForceKeyboardDrivenUINavigation();
 
+  // Registers local pref names for touchpad and touch screen statuses.
+  static void RegisterPrefs(PrefRegistrySimple* registry);
+
+  void InitTouchDevicesStatusFromLocalPrefs();
+
+  // Toggles the status of Touchscreen/Touchpad on or off and updates the local
+  // prefs.
+  void ToggleTouchscreen();
+  void ToggleTouchpad();
+
   // Calls |callback| asynchronously after determining if a touchpad is
   // connected.
   virtual void TouchpadExists(const DeviceExistsCallback& callback) = 0;
@@ -210,6 +222,10 @@
 
   // Reapplies previously set mouse settings.
   virtual void ReapplyMouseSettings() = 0;
+
+ private:
+  virtual void SetInternalTouchpadEnabled(bool enabled) {}
+  virtual void SetTouchscreensEnabled(bool enabled) {}
 };
 
 }  // namespace system
diff --git a/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc b/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc
index b9e92df6..3a3d98e 100644
--- a/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc
+++ b/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc
@@ -39,6 +39,8 @@
   void SetPrimaryButtonRight(bool right) override;
   void ReapplyTouchpadSettings() override;
   void ReapplyMouseSettings() override;
+  void SetInternalTouchpadEnabled(bool enabled) override;
+  void SetTouchscreensEnabled(bool enabled) override;
 
   // Cached InputController pointer. It should be fixed throughout the browser
   // session.
@@ -128,6 +130,14 @@
   MouseSettings::Apply(current_mouse_settings_, this);
 }
 
+void InputDeviceSettingsImplOzone::SetInternalTouchpadEnabled(bool enabled) {
+  input_controller_->SetInternalTouchpadEnabled(enabled);
+}
+
+void InputDeviceSettingsImplOzone::SetTouchscreensEnabled(bool enabled) {
+  input_controller_->SetTouchscreensEnabled(enabled);
+}
+
 }  // namespace
 
 // static
diff --git a/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc b/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc
index b9be3aa0..2167403 100644
--- a/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc
+++ b/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc
@@ -22,6 +22,10 @@
 #include "base/task_runner.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "content/public/browser/browser_thread.h"
+#include "ui/events/base_event_utils.h"
+#include "ui/events/devices/x11/device_data_manager_x11.h"
+#include "ui/events/devices/x11/device_list_cache_x11.h"
+#include "ui/gfx/x/x11_types.h"
 
 namespace chromeos {
 namespace system {
@@ -35,6 +39,9 @@
 const char kDeviceTypeMouse[] = "mouse";
 const char kInputControl[] = "/opt/google/input/inputcontrol";
 
+// The name of the xinput device corresponding to the internal touchpad.
+const char kInternalTouchpadName[] = "Elan Touchpad";
+
 typedef base::RefCountedData<bool> RefCountedBool;
 
 bool ScriptExists(const std::string& script) {
@@ -160,6 +167,8 @@
   void SetPrimaryButtonRight(bool right) override;
   void ReapplyTouchpadSettings() override;
   void ReapplyMouseSettings() override;
+  void SetInternalTouchpadEnabled(bool enabled) override;
+  void SetTouchscreensEnabled(bool enabled) override;
 
   // Generate arguments for the inputcontrol script.
   //
@@ -261,6 +270,33 @@
   UpdateMouseSettings(settings);
 }
 
+void InputDeviceSettingsImplX11::SetInternalTouchpadEnabled(bool enabled) {
+  ui::DeviceDataManagerX11* device_data_manager =
+      ui::DeviceDataManagerX11::GetInstance();
+  if (!device_data_manager->IsXInput2Available())
+    return;
+
+  const XIDeviceList& xi_dev_list =
+      ui::DeviceListCacheX11::GetInstance()->GetXI2DeviceList(
+          gfx::GetXDisplay());
+  for (int i = 0; i < xi_dev_list.count; ++i) {
+    std::string device_name(xi_dev_list[i].name);
+    base::TrimWhitespaceASCII(device_name, base::TRIM_TRAILING, &device_name);
+    if (device_name == kInternalTouchpadName) {
+      if (enabled)
+        device_data_manager->EnableDevice(xi_dev_list[i].deviceid);
+      else
+        device_data_manager->DisableDevice(xi_dev_list[i].deviceid);
+
+      return;
+    }
+  }
+}
+
+void InputDeviceSettingsImplX11::SetTouchscreensEnabled(bool enabled) {
+  ui::SetTouchEventsEnabled(enabled);
+}
+
 void InputDeviceSettingsImplX11::GenerateTouchpadArguments(
     std::vector<std::string>* argv) {
   argv->push_back(kInputControl);
diff --git a/chrome/browser/content_settings/tab_specific_content_settings.cc b/chrome/browser/content_settings/tab_specific_content_settings.cc
index f8dff5a..32013ef 100644
--- a/chrome/browser/content_settings/tab_specific_content_settings.cc
+++ b/chrome/browser/content_settings/tab_specific_content_settings.cc
@@ -827,3 +827,31 @@
     const content::LoadCommittedDetails& details) {
   midi_usages_state_.DidNavigate(GetCommittedDetails(details));
 }
+
+void TabSpecificContentSettings::BlockAllContentForTesting() {
+  content_settings::ContentSettingsRegistry* registry =
+      content_settings::ContentSettingsRegistry::GetInstance();
+  for (const content_settings::ContentSettingsInfo* info : *registry) {
+    ContentSettingsType type = info->website_settings_info()->type();
+    if (type != CONTENT_SETTINGS_TYPE_GEOLOCATION &&
+        type != CONTENT_SETTINGS_TYPE_MEDIASTREAM &&
+        type != CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC &&
+        type != CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) {
+      OnContentBlocked(type);
+    }
+  }
+
+  // Geolocation and media must be blocked separately, as the generic
+  // TabSpecificContentSettings::OnContentBlocked does not apply to them.
+  OnGeolocationPermissionSet(web_contents()->GetLastCommittedURL(), false);
+  MicrophoneCameraStateFlags media_blocked =
+      static_cast<MicrophoneCameraStateFlags>(
+          TabSpecificContentSettings::MICROPHONE_ACCESSED |
+          TabSpecificContentSettings::MICROPHONE_BLOCKED |
+          TabSpecificContentSettings::CAMERA_ACCESSED |
+          TabSpecificContentSettings::CAMERA_BLOCKED);
+  OnMediaStreamPermissionSet(
+      web_contents()->GetLastCommittedURL(),
+      media_blocked,
+      std::string(), std::string(), std::string(), std::string());
+}
diff --git a/chrome/browser/content_settings/tab_specific_content_settings.h b/chrome/browser/content_settings/tab_specific_content_settings.h
index 4be7a40..d0be280 100644
--- a/chrome/browser/content_settings/tab_specific_content_settings.h
+++ b/chrome/browser/content_settings/tab_specific_content_settings.h
@@ -359,6 +359,9 @@
   // Removes the given |SiteDataObserver|.
   void RemoveSiteDataObserver(SiteDataObserver* observer);
 
+  // Block all content. Used for testing content setting bubbles.
+  void BlockAllContentForTesting();
+
  private:
   friend class content::WebContentsUserData<TabSpecificContentSettings>;
 
diff --git a/chrome/browser/devtools/devtools_network_controller_unittest.cc b/chrome/browser/devtools/devtools_network_controller_unittest.cc
index 0abcc5d..b399bb1a 100644
--- a/chrome/browser/devtools/devtools_network_controller_unittest.cc
+++ b/chrome/browser/devtools/devtools_network_controller_unittest.cc
@@ -84,7 +84,20 @@
   }
 
   bool ShouldFail() {
-    return transaction_->interceptor_->ShouldFail();
+    if (transaction_->interceptor_)
+      return transaction_->interceptor_->ShouldFail();
+    base::WeakPtr<DevToolsNetworkInterceptor> interceptor =
+        controller_.GetInterceptor(kClientId);
+    EXPECT_TRUE(!!interceptor);
+    return interceptor->ShouldFail();
+  }
+
+  bool HasStarted() {
+    return !!transaction_->request_;
+  }
+
+  bool HasFailed() {
+    return transaction_->failed_;
   }
 
   ~DevToolsNetworkControllerHelper() {
@@ -184,10 +197,10 @@
 
   int rv = helper.Start();
   EXPECT_EQ(rv, net::OK);
-  EXPECT_TRUE(helper.transaction()->HasStarted());
+  EXPECT_TRUE(helper.HasStarted());
 
   helper.SetNetworkState(kClientId, true);
-  EXPECT_TRUE(helper.transaction()->HasFailed());
+  EXPECT_TRUE(helper.HasFailed());
 
   scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(64));
   rv = helper.Read();
diff --git a/chrome/browser/devtools/devtools_network_interceptor.cc b/chrome/browser/devtools/devtools_network_interceptor.cc
index bd464be..a30baaf 100644
--- a/chrome/browser/devtools/devtools_network_interceptor.cc
+++ b/chrome/browser/devtools/devtools_network_interceptor.cc
@@ -77,8 +77,6 @@
     for (;it != old_throttables.end(); ++it) {
       if (throttables_.find(*it) == throttables_.end())
         continue;
-      if (!(*it)->HasStarted() || (*it)->HasFailed())
-        continue;
       (*it)->Fail();
     }
     return;
diff --git a/chrome/browser/devtools/devtools_network_interceptor.h b/chrome/browser/devtools/devtools_network_interceptor.h
index 35402fa4a..18e9409 100644
--- a/chrome/browser/devtools/devtools_network_interceptor.h
+++ b/chrome/browser/devtools/devtools_network_interceptor.h
@@ -28,8 +28,6 @@
   class Throttable {
    public:
     virtual ~Throttable() {}
-    virtual bool HasStarted() = 0;
-    virtual bool HasFailed() = 0;
     virtual void Fail() = 0;
     virtual int64_t ThrottledByteCount() = 0;
     virtual void Throttled(int64_t count) = 0;
diff --git a/chrome/browser/devtools/devtools_network_transaction.cc b/chrome/browser/devtools/devtools_network_transaction.cc
index f4cb8d1..8607221 100644
--- a/chrome/browser/devtools/devtools_network_transaction.cc
+++ b/chrome/browser/devtools/devtools_network_transaction.cc
@@ -38,14 +38,6 @@
     interceptor_->RemoveThrottable(this);
 }
 
-bool DevToolsNetworkTransaction::HasStarted() {
-  return !!request_;
-}
-
-bool DevToolsNetworkTransaction::HasFailed() {
-  return failed_;
-}
-
 int64_t DevToolsNetworkTransaction::ThrottledByteCount() {
   return throttled_byte_count_;
 }
@@ -127,6 +119,10 @@
   failed_ = true;
   network_transaction_->SetBeforeNetworkStartCallback(
       BeforeNetworkStartCallback());
+  if (interceptor_) {
+    interceptor_->RemoveThrottable(this);
+    interceptor_.reset();
+  }
   if (callback_.is_null())
     return;
   net::CompletionCallback callback = callback_;
@@ -145,15 +141,17 @@
   std::string client_id;
   ProcessRequest(&client_id);
   interceptor_ = controller_->GetInterceptor(client_id);
-  if (interceptor_)
-    interceptor_->AddThrottable(this);
 
   if (interceptor_ && interceptor_->ShouldFail()) {
     failed_ = true;
     network_transaction_->SetBeforeNetworkStartCallback(
         BeforeNetworkStartCallback());
+    interceptor_.reset();
     return net::ERR_INTERNET_DISCONNECTED;
   }
+
+  if (interceptor_)
+    interceptor_->AddThrottable(this);
   int rv = network_transaction_->Start(request_, proxy_callback_, net_log);
   return SetupCallback(callback, rv, START);
 }
diff --git a/chrome/browser/devtools/devtools_network_transaction.h b/chrome/browser/devtools/devtools_network_transaction.h
index df5ba2b..db829b0 100644
--- a/chrome/browser/devtools/devtools_network_transaction.h
+++ b/chrome/browser/devtools/devtools_network_transaction.h
@@ -54,8 +54,6 @@
   ~DevToolsNetworkTransaction() override;
 
   // DevToolsNetworkInterceptor::Throttable implementation.
-  bool HasStarted() override;
-  bool HasFailed() override;
   void Fail() override;
   int64_t ThrottledByteCount() override;
   void Throttled(int64_t count) override;
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc
index 381e5791..41bc33e 100644
--- a/chrome/browser/download/notification/download_item_notification.cc
+++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/download/notification/download_item_notification.h"
 
 #include "base/files/file_util.h"
+#include "base/prefs/pref_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/download_crx_util.h"
@@ -14,10 +15,12 @@
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/browser/notifications/profile_notification.h"
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/mime_util/mime_util.h"
+#include "components/url_formatter/elide_url.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_interrupt_reasons.h"
@@ -31,6 +34,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/time_format.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/base/text/bytes_formatting.h"
 #include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/image/image.h"
@@ -788,13 +792,6 @@
 }
 
 base::string16 DownloadItemNotification::GetInProgressSubStatusString() const {
-  // The download is a CRX (app, extension, theme, ...) and it is being
-  // unpacked and validated.
-  if (item_->AllDataSaved() &&
-      download_crx_util::IsExtensionDownload(*item_)) {
-    return l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_CRX_INSTALL_RUNNING);
-  }
-
   // "Paused"
   if (item_->IsPaused())
     return l10n_util::GetStringUTF16(IDS_DOWNLOAD_PROGRESS_PAUSED);
@@ -836,19 +833,41 @@
   if (item_->IsDangerous())
     return GetWarningStatusString();
 
+  // The hostname. (E.g.:"example.com" or "127.0.0.1")
+  base::string16 host_name =
+      url_formatter::FormatUrlForSecurityDisplayOmitScheme(
+          item_->GetURL(),
+          profile()->GetPrefs()->GetString(prefs::kAcceptLanguages));
+
   DownloadItemModel model(item_);
   base::string16 sub_status_text;
+  bool show_size_ratio = true;
   switch (item_->GetState()) {
     case content::DownloadItem::IN_PROGRESS:
-      sub_status_text = GetInProgressSubStatusString();
+      // The download is a CRX (app, extension, theme, ...) and it is being
+      // unpacked and validated.
+      if (item_->AllDataSaved() &&
+          download_crx_util::IsExtensionDownload(*item_)) {
+        show_size_ratio = false;
+        sub_status_text =
+            l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_CRX_INSTALL_RUNNING);
+      } else {
+        sub_status_text = GetInProgressSubStatusString();
+      }
       break;
     case content::DownloadItem::COMPLETE:
       // If the file has been removed: Removed
       if (item_->GetFileExternallyRemoved()) {
+        show_size_ratio = false;
         sub_status_text =
             l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_REMOVED);
+      } else {
+        // Otherwise, the download should be completed.
+        // "3.4 MB from example.com"
+        base::string16 size = ui::FormatBytes(item_->GetReceivedBytes());
+        return l10n_util::GetStringFUTF16(
+            IDS_DOWNLOAD_NOTIFICATION_STATUS_COMPLETED, size, host_name);
       }
-      // Otherwise, no sub status text.
       break;
     case content::DownloadItem::CANCELLED:
       // "Cancelled"
@@ -874,24 +893,15 @@
       NOTREACHED();
   }
 
-  // The hostname. (E.g.:"example.com" or "127.0.0.1")
-  base::string16 host_name = base::UTF8ToUTF16(item_->GetURL().host());
+  // Indication of progress (E.g.:"100/200 MB" or "100 MB"), or just the
+  // received bytes if the |show_size_ratio| flag is false.
+  base::string16 size =
+      show_size_ratio ? model.GetProgressSizesString() :
+                        ui::FormatBytes(item_->GetReceivedBytes());
 
-  // Indication of progress. (E.g.:"100/200 MB" or "100 MB")
-  base::string16 size_ratio = model.GetProgressSizesString();
-
-  if (sub_status_text.empty()) {
-    // Download completed: "3.4/3.4 MB from example.com"
-    DCHECK_EQ(item_->GetState(), content::DownloadItem::COMPLETE);
-    return l10n_util::GetStringFUTF16(
-        IDS_DOWNLOAD_NOTIFICATION_STATUS_COMPLETED,
-        size_ratio, host_name);
-  }
-
-  // Download is not completed: "3.4/3.4 MB from example.com, <SUB STATUS>"
+  // Download is not completed yet: "3.4/5.6 MB, <SUB STATUS>\nFrom example.com"
   return l10n_util::GetStringFUTF16(
-      IDS_DOWNLOAD_NOTIFICATION_STATUS,
-      size_ratio, host_name, sub_status_text);
+      IDS_DOWNLOAD_NOTIFICATION_STATUS, size, sub_status_text, host_name);
 }
 
 Browser* DownloadItemNotification::GetBrowser() const {
diff --git a/chrome/browser/download/notification/download_notification_browsertest.cc b/chrome/browser/download/notification/download_notification_browsertest.cc
index e2698d7..7c260ef6 100644
--- a/chrome/browser/download/notification/download_notification_browsertest.cc
+++ b/chrome/browser/download/notification/download_notification_browsertest.cc
@@ -151,6 +151,8 @@
 class NotificationUpdateObserver : public MessageCenterChangeObserver {
  public:
   NotificationUpdateObserver() {}
+  explicit NotificationUpdateObserver(const std::string& id)
+      : target_notification_id_(id) {}
   ~NotificationUpdateObserver() override {}
 
   std::string Wait() {
@@ -169,6 +171,11 @@
 
   void OnNotificationUpdated(const std::string& notification_id) override {
     if (notification_id_.empty()) {
+      if (!target_notification_id_.empty() &&
+          target_notification_id_ != notification_id) {
+        return;
+      }
+
       notification_id_ = notification_id;
 
       if (waiting_)
@@ -176,8 +183,13 @@
     }
   }
 
+  void Reset() {
+    notification_id_.clear();
+  }
+
  private:
   std::string notification_id_;
+  std::string target_notification_id_;
   bool waiting_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(NotificationUpdateObserver);
@@ -270,6 +282,8 @@
     content::BrowserThread::PostTask(
         content::BrowserThread::IO, FROM_HERE,
         base::Bind(&net::URLRequestSlowDownloadJob::AddUrlHandler));
+
+    GetMessageCenter()->DisableTimersForTest();
   }
 
   content::DownloadManager* GetDownloadManager(Browser* browser) {
@@ -386,21 +400,18 @@
   download_item()->UpdateObservers();
   download_notification_periodically_update_observer.Wait();
 
-  NotificationUpdateObserver download_notification_update_observer;
-
   // Requests to complete the download.
   ui_test_utils::NavigateToURL(
       browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
   // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
   while (download_item()->GetState() != content::DownloadItem::COMPLETE) {
-    NotificationUpdateObserver download_change_notification_observer;
     download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
   }
 
-  // Waits for new notification.
-  download_notification_update_observer.Wait();
-
   // Checks strings.
   EXPECT_EQ(l10n_util::GetStringFUTF16(
                 IDS_DOWNLOAD_STATUS_DOWNLOADED_TITLE,
@@ -540,9 +551,11 @@
   download_terminal_observer.WaitForFinished();
 
   // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
   while (GetNotification(notification_id())->image().IsEmpty()) {
-    NotificationUpdateObserver download_change_notification_observer;
     download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
   }
 }
 
@@ -555,9 +568,11 @@
       browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
   // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
   while (download_item()->GetState() != content::DownloadItem::COMPLETE) {
-    NotificationUpdateObserver download_change_notification_observer;
     download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
   }
 
   // Opens the message center.
@@ -621,7 +636,8 @@
   CreateDownload();
 
   // Installs observers before requesting.
-  NotificationUpdateObserver download_notification_update_observer;
+  NotificationUpdateObserver
+      download_notification_update_observer(notification_id());
   content::DownloadTestObserverTerminal download_terminal_observer(
       GetDownloadManager(browser()),
       1u, /* wait_count */
@@ -646,11 +662,12 @@
                 IDS_DOWNLOAD_STATUS_DOWNLOAD_FAILED_TITLE,
                 download_item()->GetFileNameToReportUser().LossyDisplayName()),
             GetNotification(notification_id())->title());
-  EXPECT_EQ(l10n_util::GetStringFUTF16(
-                IDS_DOWNLOAD_STATUS_INTERRUPTED,
-                l10n_util::GetStringUTF16(
-                    IDS_DOWNLOAD_INTERRUPTED_DESCRIPTION_NETWORK_ERROR)),
-            GetNotification(notification_id())->message().substr(48));
+  EXPECT_NE(GetNotification(notification_id())->message().find(
+                l10n_util::GetStringFUTF16(
+                    IDS_DOWNLOAD_STATUS_INTERRUPTED,
+                    l10n_util::GetStringUTF16(
+                        IDS_DOWNLOAD_INTERRUPTED_DESCRIPTION_NETWORK_ERROR))),
+            std::string::npos);
   EXPECT_EQ(message_center::NOTIFICATION_TYPE_BASE_FORMAT,
             GetNotification(notification_id())->type());
 }
@@ -711,13 +728,7 @@
   EXPECT_EQ(0u, downloads.size());
 }
 
-#if defined(MEMORY_SANITIZER)
-# define MAYBE_DownloadMultipleFiles DISABLED_DownloadMultipleFiles
-#else
-# define MAYBE_DownloadMultipleFiles DownloadMultipleFiles
-#endif
-
-IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, MAYBE_DownloadMultipleFiles) {
+IN_PROC_BROWSER_TEST_F(DownloadNotificationTest, DownloadMultipleFiles) {
   GURL url1(net::URLRequestSlowDownloadJob::kUnknownSizeUrl);
   GURL url2(net::URLRequestSlowDownloadJob::kKnownSizeUrl);
 
@@ -733,7 +744,7 @@
   std::vector<content::DownloadItem*> downloads;
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
   EXPECT_EQ(1u, downloads.size());
-  content::DownloadItem* download1or2 = downloads[0];
+  content::DownloadItem* download1 = downloads[0];
 
   // Confirms that there is a notifications.
   message_center::NotificationList::Notifications
@@ -758,11 +769,15 @@
   // Confirms that there are 2 downloads.
   downloads.clear();
   GetDownloadManager(browser())->GetAllDownloads(&downloads);
-  content::DownloadItem* download1 = downloads[0];
-  content::DownloadItem* download2 = downloads[1];
   EXPECT_EQ(2u, downloads.size());
+  content::DownloadItem* download2;
+  if (download1 == downloads[0])
+    download2 = downloads[1];
+  else if (download1 == downloads[1])
+    download2 = downloads[0];
+  else
+    NOTREACHED();
   EXPECT_NE(download1, download2);
-  EXPECT_TRUE(download1 == download1or2 || download2 == download1or2);
 
   // Confirms that there are 2 notifications.
   visible_notifications = GetMessageCenter()->GetVisibleNotifications();
@@ -798,14 +813,14 @@
 
   // Confirms that the updates of both download are delivered to the
   // notifications.
-  NotificationUpdateObserver notification_periodically_update_observer1;
+  NotificationUpdateObserver
+      notification_periodically_update_observer1(notification_id1);
   download1->UpdateObservers();
-  EXPECT_EQ(notification_id1,
-            notification_periodically_update_observer1.Wait());
-  NotificationUpdateObserver notification_periodically_update_observer2;
+  notification_periodically_update_observer1.Wait();
+  NotificationUpdateObserver
+      notification_periodically_update_observer2(notification_id2);
   download2->UpdateObservers();
-  EXPECT_EQ(notification_id2,
-            notification_periodically_update_observer2.Wait());
+  notification_periodically_update_observer2.Wait();
 
   // Requests to complete the downloads.
   ui_test_utils::NavigateToURL(
@@ -816,6 +831,7 @@
   while (download1->GetState() != content::DownloadItem::COMPLETE ||
          download2->GetState() != content::DownloadItem::COMPLETE) {
     download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
   }
 
   // Confirms that the both notifications are visible either as popup or in the
@@ -857,9 +873,11 @@
       browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
   // Waits for completion of the first download.
+  NotificationUpdateObserver
+      download_change_notification_observer1(first_notification_id);
   while (first_download_item->GetState() != content::DownloadItem::COMPLETE) {
-    NotificationUpdateObserver download_change_notification_observer;
-    download_change_notification_observer.Wait();
+    download_change_notification_observer1.Wait();
+    download_change_notification_observer1.Reset();
   }
   EXPECT_EQ(content::DownloadItem::COMPLETE, first_download_item->GetState());
 
@@ -906,9 +924,11 @@
       browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
   // Waits for completion of the second download.
+  NotificationUpdateObserver
+      download_change_notification_observer2(second_notification_id);
   while (second_download_item->GetState() != content::DownloadItem::COMPLETE) {
-    NotificationUpdateObserver download_change_notification_observer;
-    download_change_notification_observer.Wait();
+    download_change_notification_observer2.Wait();
+    download_change_notification_observer2.Reset();
   }
 
   // Opens the message center.
@@ -992,9 +1012,11 @@
       GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
   // Waits for download completion.
+  NotificationUpdateObserver
+      download_change_notification_observer(notification_id());
   while (download_item()->GetState() != content::DownloadItem::COMPLETE) {
-    NotificationUpdateObserver download_change_notification_observer;
     download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
   }
 
   EXPECT_EQ(l10n_util::GetStringFUTF16(
@@ -1074,10 +1096,11 @@
       browser(), GURL(net::URLRequestSlowDownloadJob::kFinishDownloadUrl));
 
   // Waits for the completion of downloads.
+  NotificationUpdateObserver download_change_notification_observer;
   while (download_normal->GetState() != content::DownloadItem::COMPLETE ||
          download_incognito->GetState() != content::DownloadItem::COMPLETE) {
-    NotificationUpdateObserver download_change_notification_observer;
     download_change_notification_observer.Wait();
+    download_change_notification_observer.Reset();
   }
 
   // Confirms the types of download notifications are correct.
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_api.cc b/chrome/browser/extensions/api/settings_private/settings_private_api.cc
index cf3e7806..1d1ac5d 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_api.cc
+++ b/chrome/browser/extensions/api/settings_private/settings_private_api.cc
@@ -9,7 +9,9 @@
 #include "chrome/browser/extensions/api/settings_private/settings_private_delegate_factory.h"
 #include "chrome/browser/extensions/chrome_extension_function.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
 #include "chrome/common/extensions/api/settings_private.h"
+#include "content/public/common/page_zoom.h"
 #include "extensions/browser/extension_function_registry.h"
 
 namespace extensions {
@@ -86,4 +88,41 @@
     return RespondNow(OneArgument(value.release()));
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// SettingsPrivateGetDefaultZoomPercentFunction
+////////////////////////////////////////////////////////////////////////////////
+
+SettingsPrivateGetDefaultZoomPercentFunction::
+    ~SettingsPrivateGetDefaultZoomPercentFunction() {
+}
+
+ExtensionFunction::ResponseAction
+    SettingsPrivateGetDefaultZoomPercentFunction::Run() {
+  SettingsPrivateDelegate* delegate =
+      SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context());
+
+  return RespondNow(OneArgument(delegate->GetDefaultZoomPercent().release()));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// SettingsPrivateSetDefaultZoomPercentFunction
+////////////////////////////////////////////////////////////////////////////////
+
+SettingsPrivateSetDefaultZoomPercentFunction::
+    ~SettingsPrivateSetDefaultZoomPercentFunction() {
+}
+
+ExtensionFunction::ResponseAction
+    SettingsPrivateSetDefaultZoomPercentFunction::Run() {
+  scoped_ptr<api::settings_private::SetDefaultZoomPercent::Params> parameters =
+      api::settings_private::SetDefaultZoomPercent::Params::Create(*args_);
+  EXTENSION_FUNCTION_VALIDATE(parameters.get());
+
+  SettingsPrivateDelegate* delegate =
+      SettingsPrivateDelegateFactory::GetForBrowserContext(browser_context());
+
+  delegate->SetDefaultZoomPercent(parameters->percent);
+  return RespondNow(OneArgument(new base::FundamentalValue(true)));
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_api.h b/chrome/browser/extensions/api/settings_private/settings_private_api.h
index 35d5763..07a03ece 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_api.h
+++ b/chrome/browser/extensions/api/settings_private/settings_private_api.h
@@ -60,6 +60,40 @@
   DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetPrefFunction);
 };
 
+// Implements the chrome.settingsPrivate.getDefaultZoomPercent method.
+class SettingsPrivateGetDefaultZoomPercentFunction
+    : public UIThreadExtensionFunction {
+ public:
+  SettingsPrivateGetDefaultZoomPercentFunction() {}
+  DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoomPercent",
+                             SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION);
+
+ protected:
+  ~SettingsPrivateGetDefaultZoomPercentFunction() override;
+
+  // AsyncExtensionFunction overrides.
+  ResponseAction Run() override;
+
+  DISALLOW_COPY_AND_ASSIGN(SettingsPrivateGetDefaultZoomPercentFunction);
+};
+
+// Implements the chrome.settingsPrivate.setDefaultZoomPercent method.
+class SettingsPrivateSetDefaultZoomPercentFunction
+    : public UIThreadExtensionFunction {
+ public:
+  SettingsPrivateSetDefaultZoomPercentFunction() {}
+  DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoomPercent",
+                             SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION);
+
+ protected:
+  ~SettingsPrivateSetDefaultZoomPercentFunction() override;
+
+  // AsyncExtensionFunction overrides.
+  ResponseAction Run() override;
+
+  DISALLOW_COPY_AND_ASSIGN(SettingsPrivateSetDefaultZoomPercentFunction);
+};
+
 }  // namespace extensions
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_SETTINGS_PRIVATE_SETTINGS_PRIVATE_API_H_
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
index e5f6f40..a69ad8c 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
+++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.cc
@@ -10,7 +10,9 @@
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/extensions/api/settings_private/prefs_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
 #include "chrome/common/pref_names.h"
+#include "content/public/common/page_zoom.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
 #include "url/gurl.h"
@@ -54,4 +56,18 @@
   return prefs_util_->SetPref(pref_name, value);
 }
 
+scoped_ptr<base::Value> SettingsPrivateDelegate::GetDefaultZoomPercent() {
+  double zoom = content::ZoomLevelToZoomFactor(
+      profile_->GetZoomLevelPrefs()->GetDefaultZoomLevelPref()) * 100;
+  scoped_ptr<base::Value> value(new base::FundamentalValue(zoom));
+  return value.Pass();
+}
+
+PrefsUtil::SetPrefResult SettingsPrivateDelegate::SetDefaultZoomPercent(
+    int percent) {
+  double zoom_factor = content::ZoomFactorToZoomLevel(percent * 0.01);
+  profile_->GetZoomLevelPrefs()->SetDefaultZoomLevelPref(zoom_factor);
+  return PrefsUtil::SetPrefResult::SUCCESS;
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_delegate.h b/chrome/browser/extensions/api/settings_private/settings_private_delegate.h
index 3f6c6ba..ede6e15 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_delegate.h
+++ b/chrome/browser/extensions/api/settings_private/settings_private_delegate.h
@@ -44,6 +44,12 @@
   // Gets the values of all whitelisted prefs.
   virtual scoped_ptr<base::Value> GetAllPrefs();
 
+  // Gets the value.
+  virtual scoped_ptr<base::Value> GetDefaultZoomPercent();
+
+  // Sets the pref.
+  virtual PrefsUtil::SetPrefResult SetDefaultZoomPercent(int percent);
+
  protected:
   Profile* profile_;  // weak; not owned by us
   scoped_ptr<PrefsUtil> prefs_util_;
diff --git a/chrome/browser/extensions/event_router_forwarder.cc b/chrome/browser/extensions/event_router_forwarder.cc
index ff198a1e..c74dddc2 100644
--- a/chrome/browser/extensions/event_router_forwarder.cc
+++ b/chrome/browser/extensions/event_router_forwarder.cc
@@ -90,9 +90,9 @@
   ProfileManager* profile_manager = g_browser_process->profile_manager();
   Profile* profile = NULL;
   if (profile_ptr) {
-    profile = reinterpret_cast<Profile*>(profile_ptr);
-    if (!profile_manager->IsValidProfile(profile))
+    if (!profile_manager->IsValidProfile(profile_ptr))
       return;
+    profile = reinterpret_cast<Profile*>(profile_ptr);
   }
   if (profile) {
     CallEventRouter(profile, extension_id, histogram_value, event_name,
diff --git a/chrome/browser/extensions/extension_disabled_ui.cc b/chrome/browser/extensions/extension_disabled_ui.cc
index 0c92945..05226597 100644
--- a/chrome/browser/extensions/extension_disabled_ui.cc
+++ b/chrome/browser/extensions/extension_disabled_ui.cc
@@ -13,6 +13,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/metrics/histogram.h"
+#include "base/scoped_observer.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -35,6 +36,8 @@
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_source.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_registry_observer.h"
 #include "extensions/browser/extension_util.h"
 #include "extensions/browser/image_loader.h"
 #include "extensions/browser/notification_types.h"
@@ -146,7 +149,8 @@
 class ExtensionDisabledGlobalError
     : public GlobalErrorWithStandardBubble,
       public content::NotificationObserver,
-      public extensions::ExtensionUninstallDialog::Delegate {
+      public extensions::ExtensionUninstallDialog::Delegate,
+      public extensions::ExtensionRegistryObserver {
  public:
   ExtensionDisabledGlobalError(ExtensionService* service,
                                const Extension* extension,
@@ -154,7 +158,7 @@
                                const gfx::Image& icon);
   ~ExtensionDisabledGlobalError() override;
 
-  // GlobalError implementation.
+  // GlobalError:
   Severity GetSeverity() override;
   bool HasMenuItem() override;
   int MenuItemCommandID() override;
@@ -170,16 +174,23 @@
   void BubbleViewCancelButtonPressed(Browser* browser) override;
   bool ShouldCloseOnDeactivate() const override;
 
-  // ExtensionUninstallDialog::Delegate implementation.
+  // ExtensionUninstallDialog::Delegate:
   void OnExtensionUninstallDialogClosed(bool did_start_uninstall,
                                         const base::string16& error) override;
 
-  // content::NotificationObserver implementation.
+ private:
+  // content::NotificationObserver:
   void Observe(int type,
                const content::NotificationSource& source,
                const content::NotificationDetails& details) override;
 
- private:
+  // ExtensionRegistryObserver:
+  void OnExtensionLoaded(content::BrowserContext* browser_context,
+                         const Extension* extension) override;
+  void OnShutdown(extensions::ExtensionRegistry* registry) override;
+
+  void RemoveGlobalError();
+
   ExtensionService* service_;
   const Extension* extension_;
   bool is_remote_install_;
@@ -200,6 +211,9 @@
   int menu_command_id_;
 
   content::NotificationRegistrar registrar_;
+
+  ScopedObserver<extensions::ExtensionRegistry,
+                 extensions::ExtensionRegistryObserver> registry_observer_;
 };
 
 // TODO(yoz): create error at startup for disabled extensions.
@@ -213,7 +227,8 @@
       is_remote_install_(is_remote_install),
       icon_(icon),
       user_response_(IGNORED),
-      menu_command_id_(GetMenuCommandID()) {
+      menu_command_id_(GetMenuCommandID()),
+      registry_observer_(this) {
   if (icon_.IsEmpty()) {
     icon_ = gfx::Image(
         gfx::ImageSkiaOperations::CreateResizedImage(
@@ -223,9 +238,8 @@
             skia::ImageOperations::RESIZE_BEST,
             gfx::Size(kIconSize, kIconSize)));
   }
-  registrar_.Add(this,
-                 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
-                 content::Source<Profile>(service->profile()));
+  registry_observer_.Add(
+      extensions::ExtensionRegistry::Get(service->profile()));
   registrar_.Add(this,
                  extensions::NOTIFICATION_EXTENSION_REMOVED,
                  content::Source<Profile>(service->profile()));
@@ -414,22 +428,34 @@
     const content::NotificationSource& source,
     const content::NotificationDetails& details) {
   // The error is invalidated if the extension has been loaded or removed.
-  DCHECK(type == extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED ||
-         type == extensions::NOTIFICATION_EXTENSION_REMOVED);
+  DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_REMOVED, type);
   const Extension* extension = content::Details<const Extension>(details).ptr();
   if (extension != extension_)
     return;
-  GlobalErrorServiceFactory::GetForProfile(service_->profile())->
-      RemoveGlobalError(this);
+  user_response_ = UNINSTALL;
+  RemoveGlobalError();
+}
 
-  // Make sure we don't call RemoveGlobalError again.
+void ExtensionDisabledGlobalError::OnExtensionLoaded(
+    content::BrowserContext* browser_context,
+    const Extension* extension) {
+  if (extension != extension_)
+    return;
+  user_response_ = REENABLE;
+  RemoveGlobalError();
+}
+
+void ExtensionDisabledGlobalError::OnShutdown(
+    extensions::ExtensionRegistry* registry) {
+  DCHECK_EQ(extensions::ExtensionRegistry::Get(service_->profile()), registry);
+  registry_observer_.RemoveAll();
+}
+
+void ExtensionDisabledGlobalError::RemoveGlobalError() {
+  GlobalErrorServiceFactory::GetForProfile(service_->profile())
+      ->RemoveGlobalError(this);
   registrar_.RemoveAll();
-
-  if (type == extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED)
-    user_response_ = REENABLE;
-  else if (type == extensions::NOTIFICATION_EXTENSION_REMOVED)
-    user_response_ = UNINSTALL;
-
+  registry_observer_.RemoveAll();
   // Delete this object after any running tasks, so that the extension dialog
   // still has it as a delegate to finish the current tasks.
   base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
diff --git a/chrome/browser/extensions/extension_disabled_ui.h b/chrome/browser/extensions/extension_disabled_ui.h
index 08380585..0d19d07 100644
--- a/chrome/browser/extensions/extension_disabled_ui.h
+++ b/chrome/browser/extensions/extension_disabled_ui.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_DISABLED_UI_H_
 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_DISABLED_UI_H_
 
-class Browser;
 class ExtensionService;
 namespace content {
 class WebContents;
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index c7d347ba..7390a263 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -60,7 +60,6 @@
 #include "chrome/common/url_constants.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/crx_file/id_util.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_process_host.h"
diff --git a/chrome/browser/first_run/first_run_internal_posix.cc b/chrome/browser/first_run/first_run_internal_posix.cc
index 6fb649f..eec6d162 100644
--- a/chrome/browser/first_run/first_run_internal_posix.cc
+++ b/chrome/browser/first_run/first_run_internal_posix.cc
@@ -16,7 +16,7 @@
 #include "chrome/installer/util/google_update_settings.h"
 #include "chrome/installer/util/master_preferences.h"
 #include "components/metrics/metrics_pref_names.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 
 namespace first_run {
 namespace internal {
diff --git a/chrome/browser/history/chrome_history_client.cc b/chrome/browser/history/chrome_history_client.cc
index a637844..9e1148ca 100644
--- a/chrome/browser/history/chrome_history_client.cc
+++ b/chrome/browser/history/chrome_history_client.cc
@@ -14,7 +14,6 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/history/core/browser/history_service.h"
-#include "content/public/browser/browser_thread.h"
 
 ChromeHistoryClient::ChromeHistoryClient(
     bookmarks::BookmarkModel* bookmark_model)
@@ -70,12 +69,6 @@
       IDS_COULDNT_OPEN_PROFILE_ERROR : IDS_PROFILE_TOO_NEW_ERROR);
 }
 
-void ChromeHistoryClient::PostAfterStartupTask(
-    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-    const base::Closure& task) {
-  content::BrowserThread::PostAfterStartupTask(FROM_HERE, task_runner, task);
-}
-
 scoped_ptr<history::HistoryBackendClient>
 ChromeHistoryClient::CreateBackendClient() {
   return make_scoped_ptr(new ChromeHistoryBackendClient(bookmark_model_));
diff --git a/chrome/browser/history/chrome_history_client.h b/chrome/browser/history/chrome_history_client.h
index c511b73..e939fb0a 100644
--- a/chrome/browser/history/chrome_history_client.h
+++ b/chrome/browser/history/chrome_history_client.h
@@ -35,9 +35,6 @@
   void Shutdown() override;
   bool CanAddURL(const GURL& url) override;
   void NotifyProfileError(sql::InitStatus init_status) override;
-  void PostAfterStartupTask(
-      const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-      const base::Closure& task) override;
   scoped_ptr<history::HistoryBackendClient> CreateBackendClient() override;
 
  private:
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index 0b3a688..f57bc39 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -36,6 +36,14 @@
 class CommandLine;
 }
 
+#if defined(OS_ANDROID)
+namespace chrome {
+namespace android {
+class ExternalDataUseObserver;
+}
+}
+#endif  // defined(OS_ANDROID)
+
 namespace chrome_browser_net {
 class DnsProbeService;
 }
@@ -258,6 +266,12 @@
   // a result of a field trial or a command line flag.
   static bool ShouldEnableQuicForDataReductionProxy();
 
+#if defined(OS_ANDROID)
+chrome::android::ExternalDataUseObserver* external_data_use_observer() const {
+  return external_data_use_observer_.get();
+}
+#endif  // defined(OS_ANDROID)
+
  private:
   // Map from name to value for all parameters associate with a field trial.
   typedef std::map<std::string, std::string> VariationParameters;
@@ -522,8 +536,10 @@
   // |system_network_delegate|.
   scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_;
   // An external observer of data use.
-  scoped_ptr<data_usage::DataUseAggregator::Observer>
+#if defined(OS_ANDROID)
+  scoped_ptr<chrome::android::ExternalDataUseObserver>
       external_data_use_observer_;
+#endif  // defined(OS_ANDROID)
 
   const base::TimeTicks creation_time_;
 
diff --git a/chrome/browser/mac/mac_startup_profiler.cc b/chrome/browser/mac/mac_startup_profiler.cc
index 37d247b..95aa7d8d 100644
--- a/chrome/browser/mac/mac_startup_profiler.cc
+++ b/chrome/browser/mac/mac_startup_profiler.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 
 // static
 MacStartupProfiler* MacStartupProfiler::GetInstance() {
diff --git a/chrome/browser/media/router/media_router_mojo_impl.cc b/chrome/browser/media/router/media_router_mojo_impl.cc
index 9fdd6fd..d6bb508 100644
--- a/chrome/browser/media/router/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/media_router_mojo_impl.cc
@@ -91,14 +91,12 @@
   router_->UpdateHasLocalRoute(has_local_route);
 }
 
-// TODO(mfoltz): Flip the default sink availability to UNAVAILABLE, once the
-// MRPM sends initial availability status.
 MediaRouterMojoImpl::MediaRouterMojoImpl(
     extensions::EventPageTracker* event_page_tracker)
     : event_page_tracker_(event_page_tracker),
       instance_id_(base::GenerateGUID()),
       has_local_route_(false),
-      availability_(interfaces::MediaRouter::SINK_AVAILABILITY_AVAILABLE),
+      availability_(interfaces::MediaRouter::SINK_AVAILABILITY_UNAVAILABLE),
       wakeup_attempt_count_(0),
       weak_factory_(this) {
   DCHECK(event_page_tracker_);
diff --git a/chrome/browser/media/router/media_router_mojo_impl_unittest.cc b/chrome/browser/media/router/media_router_mojo_impl_unittest.cc
index cd282ab..be57f699 100644
--- a/chrome/browser/media/router/media_router_mojo_impl_unittest.cc
+++ b/chrome/browser/media/router/media_router_mojo_impl_unittest.cc
@@ -333,6 +333,8 @@
 }
 
 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) {
+  router()->OnSinkAvailabilityUpdated(
+      interfaces::MediaRouter::SINK_AVAILABILITY_AVAILABLE);
   MediaSource media_source(kSource);
 
   MockMediaRouter mock_router;
diff --git a/chrome/browser/media/router/presentation_session_state_observer.cc b/chrome/browser/media/router/presentation_session_state_observer.cc
index 99e18d2..6b7a3e4b 100644
--- a/chrome/browser/media/router/presentation_session_state_observer.cc
+++ b/chrome/browser/media/router/presentation_session_state_observer.cc
@@ -25,7 +25,7 @@
     const MediaRoute::Id& route_id) {
   if (!ContainsValue(tracked_route_ids_, route_id))
     tracked_route_ids_.push_back(route_id);
-  InvokeCallback(route_id, content::PRESENTATION_SESSION_STATE_CONNECTED);
+  InvokeCallback(route_id, content::PRESENTATION_CONNECTION_STATE_CONNECTED);
 }
 
 void PresentationSessionStateObserver::Reset() {
@@ -45,8 +45,7 @@
     const MediaRoute::Id& route_id = *it;
     if (ContainsValue(previous_route_ids_, route_id) &&
         !ContainsValue(current_route_ids_, route_id)) {
-      InvokeCallback(route_id,
-                     content::PRESENTATION_SESSION_STATE_DISCONNECTED);
+      InvokeCallback(route_id, content::PRESENTATION_CONNECTION_STATE_CLOSED);
       it = tracked_route_ids_.erase(it);
     } else {
       ++it;
@@ -57,7 +56,7 @@
 
 void PresentationSessionStateObserver::InvokeCallback(
     const MediaRoute::Id& route_id,
-    content::PresentationSessionState new_state) {
+    content::PresentationConnectionState new_state) {
   const content::PresentationSessionInfo* session_info =
       route_id_to_presentation_->Get(route_id);
   if (session_info)
diff --git a/chrome/browser/media/router/presentation_session_state_observer.h b/chrome/browser/media/router/presentation_session_state_observer.h
index 2448b5f5..64f998ee 100644
--- a/chrome/browser/media/router/presentation_session_state_observer.h
+++ b/chrome/browser/media/router/presentation_session_state_observer.h
@@ -16,6 +16,8 @@
 
 class MediaRouter;
 
+// TODO(imcheng): Remove this class and use PresentationConnectionStateObserver
+// instead (crbug.com/529893).
 // MediaRoutesObserver implementation that allows tracking state changes from
 // multiple presentation sessions and notifying the client via
 // |state_changed_callback|.
@@ -52,7 +54,7 @@
   // Invokes |state_changed_callback_| with PresentationSessionInfo derived from
   // |route_id| and |new_state|, if |route_id| is valid.
   void InvokeCallback(const MediaRoute::Id& route_id,
-                      content::PresentationSessionState new_state);
+                      content::PresentationConnectionState new_state);
 
   // Route IDs of presentations that are being tracked for state changes.
   // It is built by adding entries when a presentation is started,
diff --git a/chrome/browser/media/router/presentation_session_state_observer_unittest.cc b/chrome/browser/media/router/presentation_session_state_observer_unittest.cc
index e58e553..fb2c8f0 100644
--- a/chrome/browser/media/router/presentation_session_state_observer_unittest.cc
+++ b/chrome/browser/media/router/presentation_session_state_observer_unittest.cc
@@ -62,7 +62,7 @@
 
   MOCK_METHOD2(OnSessionStateChanged,
                void(const content::PresentationSessionInfo& session_info,
-                    content::PresentationSessionState new_state));
+                    content::PresentationConnectionState new_state));
 
   MockMediaRouter router_;
   MediaRouteIdToPresentationSessionMapping route_id_to_presentation_;
@@ -74,7 +74,7 @@
       *this, OnSessionStateChanged(
                  PresentationSessionInfoEquals(content::PresentationSessionInfo(
                      kPresentationUrl, kPresentationId)),
-                 content::PRESENTATION_SESSION_STATE_CONNECTED));
+                 content::PRESENTATION_CONNECTION_STATE_CONNECTED));
   MediaRoute::Id route_id(CreateRouteId(kPresentationUrl, kPresentationId));
   observer_->OnPresentationSessionConnected(route_id);
 }
@@ -84,7 +84,7 @@
                                                 kPresentationId);
   EXPECT_CALL(*this, OnSessionStateChanged(
                          PresentationSessionInfoEquals(session_info),
-                         content::PRESENTATION_SESSION_STATE_CONNECTED));
+                         content::PRESENTATION_CONNECTION_STATE_CONNECTED));
   MediaRoute::Id route_id(CreateRouteId(kPresentationUrl, kPresentationId));
   observer_->OnPresentationSessionConnected(route_id);
 
@@ -98,7 +98,7 @@
   // New route list does not contain |route_id|, which means it is disconnected.
   EXPECT_CALL(*this, OnSessionStateChanged(
                          PresentationSessionInfoEquals(session_info),
-                         content::PRESENTATION_SESSION_STATE_DISCONNECTED));
+                         content::PRESENTATION_CONNECTION_STATE_CLOSED));
   observer_->OnRoutesUpdated(std::vector<MediaRoute>());
 
   // Note that it is normally not possible for |route_id| to reappear. But in
@@ -112,7 +112,7 @@
                                                 kPresentationId);
   EXPECT_CALL(*this, OnSessionStateChanged(
                          PresentationSessionInfoEquals(session_info),
-                         content::PRESENTATION_SESSION_STATE_CONNECTED));
+                         content::PRESENTATION_CONNECTION_STATE_CONNECTED));
   MediaRoute::Id route_id(CreateRouteId(kPresentationUrl, kPresentationId));
   observer_->OnPresentationSessionConnected(route_id);
 
diff --git a/chrome/browser/metrics/first_web_contents_profiler.cc b/chrome/browser/metrics/first_web_contents_profiler.cc
index 1b3a6800..17662e9 100644
--- a/chrome/browser/metrics/first_web_contents_profiler.cc
+++ b/chrome/browser/metrics/first_web_contents_profiler.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "components/metrics/profiler/tracking_synchronizer.h"
 #include "components/metrics/proto/profiler_event.pb.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "content/public/browser/navigation_handle.h"
 
 scoped_ptr<FirstWebContentsProfiler>
diff --git a/chrome/browser/mojo_runner_state.cc b/chrome/browser/mojo_runner_state.cc
new file mode 100644
index 0000000..593d0434
--- /dev/null
+++ b/chrome/browser/mojo_runner_state.cc
@@ -0,0 +1,39 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/mojo_runner_state.h"
+
+#include "mojo/application/public/cpp/application_delegate.h"
+#include "mojo/application/public/cpp/application_impl.h"
+#include "mojo/runner/child/runner_connection.h"
+
+class ChromeApplicationDelegate : public mojo::ApplicationDelegate {
+ public:
+  ChromeApplicationDelegate() {}
+  ~ChromeApplicationDelegate() override {}
+
+ private:
+  void Initialize(mojo::ApplicationImpl* application) override {
+    // TODO(beng): Connect to the window manager.
+  }
+  bool ConfigureIncomingConnection(
+      mojo::ApplicationConnection* connection) override {
+    return false;
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(ChromeApplicationDelegate);
+};
+
+MojoRunnerState::MojoRunnerState() {}
+MojoRunnerState::~MojoRunnerState() {}
+
+void MojoRunnerState::WaitForConnection() {
+  mojo::InterfaceRequest<mojo::Application> application_request;
+  runner_connection_.reset(
+      mojo::runner::RunnerConnection::ConnectToRunner(&application_request));
+  application_delegate_.reset(new ChromeApplicationDelegate);
+  application_impl_.reset(new mojo::ApplicationImpl(
+      application_delegate_.get(), application_request.Pass()));
+  application_impl_->WaitForInitialize();
+}
diff --git a/chrome/browser/mojo_runner_state.h b/chrome/browser/mojo_runner_state.h
new file mode 100644
index 0000000..09eaa62c
--- /dev/null
+++ b/chrome/browser/mojo_runner_state.h
@@ -0,0 +1,41 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MOJO_RUNNER_STATE_H_
+#define CHROME_BROWSER_MOJO_RUNNER_STATE_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+
+namespace mojo {
+class ApplicationImpl;
+namespace runner {
+class RunnerConnection;
+}
+}
+
+class ChromeApplicationDelegate;
+
+// Encapsulates a connection to a spawning mojo_runner/shell.
+// TODO(beng): figure out if/how this should be exposed to other layers
+//             of code in Chrome.
+class MojoRunnerState {
+ public:
+  MojoRunnerState();
+  ~MojoRunnerState();
+
+  // Blocks the calling thread until a connection to the spawning mojo_runner
+  // is established, an Application request from it is bound, and the
+  // Initialize() method on that application is called.
+  void WaitForConnection();
+
+ private:
+  scoped_ptr<mojo::runner::RunnerConnection> runner_connection_;
+  scoped_ptr<mojo::ApplicationImpl> application_impl_;
+  scoped_ptr<ChromeApplicationDelegate> application_delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(MojoRunnerState);
+};
+
+#endif  // CHROME_BROWSER_MOJO_RUNNER_STATE_H_
diff --git a/chrome/browser/mojo_runner_util.cc b/chrome/browser/mojo_runner_util.cc
new file mode 100644
index 0000000..ec6560e
--- /dev/null
+++ b/chrome/browser/mojo_runner_util.cc
@@ -0,0 +1,12 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/mojo_runner_util.h"
+
+#include "base/command_line.h"
+
+bool IsRunningInMojoRunner() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      "mojo-platform-channel-handle");
+}
diff --git a/chrome/browser/mojo_runner_util.h b/chrome/browser/mojo_runner_util.h
new file mode 100644
index 0000000..ff1a2e9
--- /dev/null
+++ b/chrome/browser/mojo_runner_util.h
@@ -0,0 +1,11 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MOJO_RUNNER_UTIL_H_
+#define CHROME_BROWSER_MOJO_RUNNER_UTIL_H_
+
+// Returns true if the Chrome browser process was launched from the mojo_runner.
+bool IsRunningInMojoRunner();
+
+#endif  // CHROME_BROWSER_MOJO_RUNNER_UTIL_H_
diff --git a/chrome/browser/net/chrome_extensions_network_delegate.cc b/chrome/browser/net/chrome_extensions_network_delegate.cc
index d190088..42fc490 100644
--- a/chrome/browser/net/chrome_extensions_network_delegate.cc
+++ b/chrome/browser/net/chrome_extensions_network_delegate.cc
@@ -35,9 +35,9 @@
                             int process_id,
                             int render_frame_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  Profile* profile = reinterpret_cast<Profile*>(profile_id);
-  if (!g_browser_process->profile_manager()->IsValidProfile(profile))
+  if (!g_browser_process->profile_manager()->IsValidProfile(profile_id))
     return;
+  Profile* profile = reinterpret_cast<Profile*>(profile_id);
 
   extensions::ProcessManager* process_manager =
       extensions::ProcessManager::Get(profile);
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index 8547e49..0f1971f0 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -115,9 +115,9 @@
                                    void* profile_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  Profile* profile = reinterpret_cast<Profile*>(profile_id);
-  if (!g_browser_process->profile_manager()->IsValidProfile(profile))
+  if (!g_browser_process->profile_manager()->IsValidProfile(profile_id))
     return;
+  Profile* profile = reinterpret_cast<Profile*>(profile_id);
 
   precache::PrecacheManager* precache_manager =
       precache::PrecacheManagerFactory::GetForBrowserContext(profile);
diff --git a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
index 0e83420..224cb8b 100644
--- a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
@@ -49,6 +49,12 @@
   return is_possible_search_referrer && !IsFromGoogle(url);
 }
 
+bool ShouldLogEvent(const base::TimeDelta& event,
+                    const base::TimeDelta& first_background) {
+  return !event.is_zero() &&
+         (first_background.is_zero() || event < first_background);
+}
+
 }  // namespace
 
 FromGWSPageLoadMetricsObserver::FromGWSPageLoadMetricsObserver(
@@ -66,29 +72,28 @@
     const page_load_metrics::PageLoadExtraInfo& extra_info) {
   if (!navigation_from_gws_)
     return;
-  // Filter for navigations that never backgrounded.
-  if (!extra_info.started_in_foreground ||
-      !extra_info.first_background_time.is_zero()) {
+  // Filter out navigations that started in the background.
+  if (!extra_info.started_in_foreground)
     return;
-  }
 
-  if (!timing.dom_content_loaded_event_start.is_zero()) {
+  const base::TimeDelta& first_background = extra_info.first_background_time;
+  if (ShouldLogEvent(timing.dom_content_loaded_event_start, first_background)) {
     PAGE_LOAD_HISTOGRAM(
         "PageLoad.Clients.FromGWS.Timing2."
         "NavigationToDOMContentLoadedEventFired",
         timing.dom_content_loaded_event_start);
   }
-  if (!timing.load_event_start.is_zero()) {
+  if (ShouldLogEvent(timing.load_event_start, first_background)) {
     PAGE_LOAD_HISTOGRAM(
         "PageLoad.Clients.FromGWS.Timing2.NavigationToLoadEventFired",
         timing.load_event_start);
   }
-  if (!timing.first_layout.is_zero()) {
+  if (ShouldLogEvent(timing.first_layout, first_background)) {
     PAGE_LOAD_HISTOGRAM(
         "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstLayout",
         timing.first_layout);
   }
-  if (!timing.first_text_paint.is_zero()) {
+  if (ShouldLogEvent(timing.first_text_paint, first_background)) {
     PAGE_LOAD_HISTOGRAM(
         "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstTextPaint",
         timing.first_text_paint);
diff --git a/chrome/browser/page_load_metrics/observers/page_load_metrics_observers_unittest.cc b/chrome/browser/page_load_metrics/observers/page_load_metrics_observers_unittest.cc
index 2e29488..e8557d44 100644
--- a/chrome/browser/page_load_metrics/observers/page_load_metrics_observers_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/page_load_metrics_observers_unittest.cc
@@ -124,6 +124,29 @@
                                       1);
 }
 
+TEST_F(PageLoadMetricsObserverTest, ReferralFromGWSBackgroundLater) {
+  page_load_metrics::PageLoadTiming timing;
+  timing.navigation_start = base::Time::FromDoubleT(1);
+  timing.first_text_paint = base::TimeDelta::FromMicroseconds(1);
+
+  gws_observer_->set_referrer(content::Referrer(
+      GURL("https://www.google.com/url"), blink::WebReferrerPolicyDefault));
+  NavigateAndCommit(GURL("https://www.example.com"));
+
+  observer_->OnMessageReceived(
+      PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
+      web_contents()->GetMainFrame());
+
+  observer_->WasHidden();
+
+  // Navigate again to force logging.
+  NavigateAndCommit(GURL("https://www.example2.com"));
+  histogram_tester_.ExpectTotalCount(kHistogramNameFromGWSFirstTextPaint, 1);
+  histogram_tester_.ExpectBucketCount(kHistogramNameFromGWSFirstTextPaint,
+                                      timing.first_text_paint.InMilliseconds(),
+                                      1);
+}
+
 TEST_F(PageLoadMetricsObserverTest, ReferralsFromCaseInsensitive) {
   page_load_metrics::PageLoadTiming timing;
   timing.navigation_start = base::Time::FromDoubleT(1);
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 3c3381ec..7e08669 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -182,6 +182,7 @@
 #include "chrome/browser/chromeos/settings/device_settings_cache.h"
 #include "chrome/browser/chromeos/status/data_promo_notification.h"
 #include "chrome/browser/chromeos/system/automatic_reboot_manager.h"
+#include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h"
 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
 #include "chrome/browser/media/protected_media_identifier_permission_context.h"
@@ -326,6 +327,7 @@
   chromeos::SigninScreenHandler::RegisterPrefs(registry);
   chromeos::StartupUtils::RegisterPrefs(registry);
   chromeos::system::AutomaticRebootManager::RegisterPrefs(registry);
+  chromeos::system::InputDeviceSettings::RegisterPrefs(registry);
   chromeos::UserImageManager::RegisterPrefs(registry);
   chromeos::UserSessionManager::RegisterPrefs(registry);
   chromeos::WallpaperManager::RegisterPrefs(registry);
diff --git a/chrome/browser/profiles/host_zoom_map_browsertest.cc b/chrome/browser/profiles/host_zoom_map_browsertest.cc
index 2fdf781..9bf73bf 100644
--- a/chrome/browser/profiles/host_zoom_map_browsertest.cc
+++ b/chrome/browser/profiles/host_zoom_map_browsertest.cc
@@ -432,3 +432,24 @@
       new_default_zoom_level);
   EXPECT_EQ(new_default_zoom_level, child_host_zoom_map->GetDefaultZoomLevel());
 }
+
+IN_PROC_BROWSER_TEST_F(HostZoomMapBrowserTest, PageScaleIsOneChanged) {
+  GURL test_url(url::kAboutBlankURL);
+  std::string test_host(test_url.host());
+
+  ui_test_utils::NavigateToURL(browser(), test_url);
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  ASSERT_TRUE(content::HostZoomMap::PageScaleFactorIsOne(web_contents));
+
+  ZoomLevelChangeObserver observer(browser()->profile());
+
+  web_contents->SetPageScale(1.5);
+  observer.BlockUntilZoomLevelForHostHasChanged(test_host);
+  EXPECT_FALSE(content::HostZoomMap::PageScaleFactorIsOne(web_contents));
+
+  web_contents->SetPageScale(1.f);
+  observer.BlockUntilZoomLevelForHostHasChanged(test_host);
+  EXPECT_TRUE(content::HostZoomMap::PageScaleFactorIsOne(web_contents));
+}
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 265cbca9..ee740bc7 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -466,7 +466,7 @@
   }
 }
 
-bool ProfileManager::IsValidProfile(Profile* profile) {
+bool ProfileManager::IsValidProfile(void* profile) {
   for (ProfilesInfoMap::iterator iter = profiles_info_.begin();
        iter != profiles_info_.end(); ++iter) {
     if (iter->second->created) {
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h
index c6279b88..6f84225e 100644
--- a/chrome/browser/profiles/profile_manager.h
+++ b/chrome/browser/profiles/profile_manager.h
@@ -95,7 +95,7 @@
 
   // Returns true if the profile pointer is known to point to an existing
   // profile.
-  bool IsValidProfile(Profile* profile);
+  bool IsValidProfile(void* profile);
 
   // Returns the directory where the first created profile is stored,
   // relative to the user data directory currently in use.
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 2b16ce3..b5a5755 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -159,6 +159,14 @@
 
 namespace {
 
+// State of the profile that is activated via "Open Link as User".
+enum UmaEnumOpenLinkAsUser {
+  OPEN_LINK_AS_USER_ACTIVE_PROFILE_ENUM_ID,
+  OPEN_LINK_AS_USER_INACTIVE_PROFILE_MULTI_PROFILE_SESSION_ENUM_ID,
+  OPEN_LINK_AS_USER_INACTIVE_PROFILE_SINGLE_PROFILE_SESSION_ENUM_ID,
+  OPEN_LINK_AS_USER_LAST_ENUM_ID,
+};
+
 // Whether to return the general enum_id or context_specific_enum_id
 // in the FindUMAEnumValueForCommand lookup function.
 enum UmaEnumIdLookupType {
@@ -465,6 +473,7 @@
                        &menu_model_,
                        base::Bind(MenuItemMatchesParams, params_)),
       profile_link_submenu_model_(this),
+      multiple_profiles_open_(false),
       protocol_handler_submenu_model_(this),
       protocol_handler_registry_(
           ProtocolHandlerRegistryFactory::GetForBrowserContext(GetProfile())),
@@ -879,6 +888,9 @@
       ProfileManager* profile_manager = g_browser_process->profile_manager();
       const ProfileInfoCache& profile_info_cache =
           profile_manager->GetProfileInfoCache();
+      chrome::HostDesktopType desktop_type =
+          chrome::GetHostDesktopTypeForNativeView(
+              source_web_contents_->GetNativeView());
 
       // Find all regular profiles other than the current one which have at
       // least one open window.
@@ -893,6 +905,8 @@
             !profile_info_cache.IsOmittedProfileAtIndex(profile_index) &&
             !profile_info_cache.ProfileIsSigninRequiredAtIndex(profile_index)) {
           target_profiles.push_back(profile_index);
+          if (chrome::FindLastActiveWithProfile(profile, desktop_type))
+            multiple_profiles_open_ = true;
         }
       }
 
@@ -1631,6 +1645,20 @@
         chrome::GetHostDesktopTypeForNativeView(
             source_web_contents_->GetNativeView());
 
+    Profile* profile = profile_manager->GetProfileByPath(profile_path);
+    UmaEnumOpenLinkAsUser profile_state;
+    if (chrome::FindLastActiveWithProfile(profile, desktop_type)) {
+      profile_state = OPEN_LINK_AS_USER_ACTIVE_PROFILE_ENUM_ID;
+    } else if (multiple_profiles_open_) {
+      profile_state =
+          OPEN_LINK_AS_USER_INACTIVE_PROFILE_MULTI_PROFILE_SESSION_ENUM_ID;
+    } else {
+      profile_state =
+          OPEN_LINK_AS_USER_INACTIVE_PROFILE_SINGLE_PROFILE_SESSION_ENUM_ID;
+    }
+    UMA_HISTOGRAM_ENUMERATION("RenderViewContextMenu.OpenLinkAsUser",
+                              profile_state, OPEN_LINK_AS_USER_LAST_ENUM_ID);
+
     profiles::SwitchToProfile(
         profile_path, desktop_type, false,
         base::Bind(OnProfileCreated, desktop_type, params_.link_url,
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.h b/chrome/browser/renderer_context_menu/render_view_context_menu.h
index 8312397..89669ff 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.h
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.h
@@ -169,6 +169,7 @@
   GURL selection_navigation_url_;
 
   ui::SimpleMenuModel profile_link_submenu_model_;
+  bool multiple_profiles_open_;
   ui::SimpleMenuModel protocol_handler_submenu_model_;
   ProtocolHandlerRegistry* protocol_handler_registry_;
 
diff --git a/chrome/browser/resources/bookmark_manager/css/bmm.css b/chrome/browser/resources/bookmark_manager/css/bmm.css
index c928131..78eb5cf 100644
--- a/chrome/browser/resources/bookmark_manager/css/bmm.css
+++ b/chrome/browser/resources/bookmark_manager/css/bmm.css
@@ -206,6 +206,7 @@
   border-top: 1px solid rgb(156, 194, 239);
   display: flex;
   flex: 1;
+  min-height: 0;
 }
 
 .pane,
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
index 1f09ad4..5f2039a 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
+++ b/chrome/browser/resources/chromeos/chromevox/braille/braille_display_manager.js
@@ -373,7 +373,7 @@
     // This happens when the user clicks on the right part of the display
     // when it is not entirely filled with content.  Allow addressing the
     // position after the last character.
-    return this.content_.text.getLength();
+    return this.content_.text.length;
   } else {
     return mapping[braillePosition];
   }
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/chromevox/braille/braille_input_handler.js
index 5dc4c9a0..2f06fb84 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/braille_input_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/braille/braille_input_handler.js
@@ -130,8 +130,7 @@
   /**
    * Called when the content on the braille display is updated.  Modifies the
    * input state according to the new content.
-   * @param {cvox.Spannable} text Text, optionally with value and selection
-   *     spans.
+   * @param {Spannable} text Text, optionally with value and selection spans.
    * @param {function()} listener Called when the uncommitted cells
    *     have changed.
    */
@@ -144,12 +143,10 @@
     // set.  If the old listener is not cleared here, it could be called
     // spuriously if the entry state is cleared below.
     this.uncommittedCellsChangedListener_ = null;
-    // The type casts are ok because the spans are known to exist.
-    var valueStart = /** @type {number} */ (text.getSpanStart(valueSpan));
-    var valueEnd = /** @type {number} */ (text.getSpanEnd(valueSpan));
-    var selectionStart =
-        /** @type {number} */ (text.getSpanStart(selectionSpan));
-    var selectionEnd = /** @type {number} */ (text.getSpanEnd(selectionSpan));
+    var valueStart = text.getSpanStart(valueSpan);
+    var valueEnd = text.getSpanEnd(valueSpan);
+    var selectionStart = text.getSpanStart(selectionSpan);
+    var selectionEnd = text.getSpanEnd(selectionSpan);
     if (selectionStart < valueStart || selectionEnd > valueEnd) {
       console.error('Selection outside of value in braille content');
       this.clearEntryState_();
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
index 45b5ffb..0a8bdfb 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
+++ b/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
@@ -9,9 +9,9 @@
 
 goog.provide('cvox.ExpandingBrailleTranslator');
 
+goog.require('Spannable');
 goog.require('cvox.ExtraCellsSpan');
 goog.require('cvox.LibLouis');
-goog.require('cvox.Spannable');
 goog.require('cvox.ValueSelectionSpan');
 goog.require('cvox.ValueSpan');
 
@@ -79,7 +79,7 @@
 /**
  * Translates text to braille using the translator(s) provided to the
  * constructor.  See {@code cvox.LibLouis.Translator} for further details.
- * @param {!cvox.Spannable} text Text to translate.
+ * @param {!Spannable} text Text to translate.
  * @param {cvox.ExpandingBrailleTranslator.ExpansionType} expansionType
  *     Indicates how the text marked by a value span, if any, is expanded.
  * @param {function(!ArrayBuffer, !Array<number>, !Array<number>)}
@@ -98,7 +98,7 @@
     this.defaultTranslator_.translate(
         text.toString(),
         cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_(
-            text.getLength(), callback));
+            text.length, callback));
     return;
   }
 
@@ -135,7 +135,7 @@
     addChunk(this.uncontractedTranslator_, range.start, range.end);
     lastEnd = range.end;
   }
-  addChunk(this.defaultTranslator_, lastEnd, text.getLength());
+  addChunk(this.defaultTranslator_, lastEnd, text.length);
 
   var chunksToTranslate = chunks.filter(function(chunk) {
     return chunk.translator;
@@ -219,7 +219,7 @@
 
 /**
  * Finds the ranges in which contracted braille should not be used.
- * @param {!cvox.Spannable} text Text to find expansion ranges in.
+ * @param {!Spannable} text Text to find expansion ranges in.
  * @param {cvox.ExpandingBrailleTranslator.ExpansionType} expansionType
  *     Indicates how the text marked up as the value is expanded.
  * @return {!Array<cvox.ExpandingBrailleTranslator.Range_>} The calculated
@@ -233,10 +233,8 @@
       expansionType != cvox.ExpandingBrailleTranslator.ExpansionType.NONE) {
     var value = text.getSpanInstanceOf(cvox.ValueSpan);
     if (value) {
-      // The below type casts are valid because the ranges must be valid when
-      // the span is known to exist.
-      var valueStart = /** @type {number} */ (text.getSpanStart(value));
-      var valueEnd = /** @type {number} */ (text.getSpanEnd(value));
+      var valueStart = text.getSpanStart(value);
+      var valueEnd = text.getSpanEnd(value);
       switch (expansionType) {
         case cvox.ExpandingBrailleTranslator.ExpansionType.SELECTION:
           this.addRangesForSelection_(text, valueStart, valueEnd, result);
@@ -255,7 +253,7 @@
 /**
  * Finds ranges to expand around selection end points inside the value of
  * a string.  If any ranges are found, adds them to {@code outRanges}.
- * @param {cvox.Spannable} text Text to find ranges in.
+ * @param {Spannable} text Text to find ranges in.
  * @param {number} valueStart Start of the value in {@code text}.
  * @param {number} valueEnd End of the value in {@code text}.
  * @param {Array<cvox.ExpandingBrailleTranslator.Range_>} outRanges
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs b/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs
index 8b4f3137..00a8c99f 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs
+++ b/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator_test.unitjs
@@ -18,9 +18,9 @@
 
   /** @override */
   closureModuleDeps: [
+    'Spannable',
     'cvox.ExpandingBrailleTranslator',
     'cvox.LibLouis',
-    'cvox.Spannable',
     'cvox.ValueSelectionSpan',
     'cvox.ValueSpan',
   ]
@@ -74,7 +74,7 @@
 
 TEST_F('CvoxExpandingBrailleTranslatorUnitTest', 'TranslationError',
     function() {
-  var text = new cvox.Spannable('error ok', new cvox.ValueSpan());
+  var text = new Spannable('error ok', new cvox.ValueSpan());
   text.setSpan(new cvox.ValueSelectionSpan, 0, 0);
   var contractedTranslator = new FakeTranslator('c');
   // Translator that always results in an error.
@@ -133,7 +133,7 @@
       var extraCellsSpanPos = text.getSpanStart(extraCellsSpan);
     var expectedTextToBraille = [];
     var expectedBrailleToText = [];
-    for (var i = 0, pos = 0; i < text.getLength(); ++i, ++pos) {
+    for (var i = 0, pos = 0; i < text.length; ++i, ++pos) {
       if (i === extraCellsSpanPos)
         ++pos;
       expectedTextToBraille.push(pos);
@@ -190,10 +190,10 @@
   if (contracted && valueExpansion === expType.SELECTION) {
     expectedOutput = testCase.contractedOutput;
   } else if (contracted && valueExpansion === expType.ALL) {
-    expectedOutput = new Array(testCase.input.getLength() + 1).join('u');
+    expectedOutput = new Array(testCase.input.length + 1).join('u');
   } else {
     expectedOutput =
-        new Array(testCase.input.getLength() + 1).join(outputChar);
+        new Array(testCase.input.length + 1).join(outputChar);
   }
   if (withExtraCells) {
     expectedOutput = expectedOutput.substring(0, selectionStart) + 'e' +
@@ -203,12 +203,12 @@
                     expectedOutput);
 
   // Run another test, with the value surrounded by some text.
-  var surroundedText = new cvox.Spannable('Name: ');
+  var surroundedText = new Spannable('Name: ');
   var surroundedExpectedOutput =
       new Array('Name: '.length + 1).join(outputChar);
   surroundedText.append(input);
   surroundedExpectedOutput += expectedOutput;
-  if (testCase.input.getLength() > 0) {
+  if (testCase.input.length > 0) {
     surroundedText.append(' ');
     surroundedExpectedOutput += outputChar;
   }
@@ -227,7 +227,7 @@
  * @param {=opt_selectionEnd} Selection end if selection is not a caret.
  */
 function createText(text, opt_selectionStart, opt_selectionEnd) {
-  var result = new cvox.Spannable(text);
+  var result = new Spannable(text);
 
   result.setSpan(new cvox.ValueSpan, 0, text.length);
   if (goog.isDef(opt_selectionStart)) {
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js b/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js
index 4aaa9487..440abec 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js
+++ b/chrome/browser/resources/chromeos/chromevox/braille/nav_braille.js
@@ -11,12 +11,12 @@
 
 goog.provide('cvox.NavBraille');
 
-goog.require('cvox.Spannable');
+goog.require('Spannable');
 
 /**
  * A class capturing the braille for navigation from one object to
  * another.
- * @param {{text: (undefined|string|!cvox.Spannable),
+ * @param {{text: (undefined|string|!Spannable),
  *          startIndex: (undefined|number),
  *          endIndex: (undefined|number)}} kwargs The arguments for braille.
  *  text The text of the object itself, including text from
@@ -28,10 +28,10 @@
 cvox.NavBraille = function(kwargs) {
   /**
    * Text, annotated with DOM nodes.
-   * @type {!cvox.Spannable}
+   * @type {!Spannable}
    */
-  this.text = (kwargs.text instanceof cvox.Spannable) ?
-      kwargs.text : new cvox.Spannable(kwargs.text);
+  this.text = (kwargs.text instanceof Spannable) ?
+      kwargs.text : new Spannable(kwargs.text);
 
   /**
    * Selection start index.
@@ -49,7 +49,7 @@
 
 /**
  * Convenience for creating simple braille output.
- * @param {string|!cvox.Spannable} text Text to represent in braille.
+ * @param {string|!Spannable} text Text to represent in braille.
  * @return {!cvox.NavBraille} Braille output without a cursor.
  */
 cvox.NavBraille.fromText = function(text) {
@@ -69,7 +69,7 @@
     throw 'Invalid start or end index in serialized NavBraille: ' + json;
   }
   return new cvox.NavBraille({
-    text: cvox.Spannable.fromJson(json.spannable),
+    text: Spannable.fromJson(json.spannable),
     startIndex: json.startIndex,
     endIndex: json.endIndex
   });
@@ -80,7 +80,7 @@
  * @return {boolean} true if this braille description is empty.
  */
 cvox.NavBraille.prototype.isEmpty = function() {
-  return this.text.getLength() == 0;
+  return this.text.length == 0;
 };
 
 
diff --git a/chrome/browser/resources/chromeos/chromevox/braille/spans.js b/chrome/browser/resources/chromeos/chromevox/braille/spans.js
index 39ffea6..103da9c 100644
--- a/chrome/browser/resources/chromeos/chromevox/braille/spans.js
+++ b/chrome/browser/resources/chromeos/chromevox/braille/spans.js
@@ -11,7 +11,7 @@
 goog.provide('cvox.ValueSelectionSpan');
 goog.provide('cvox.ValueSpan');
 
-goog.require('cvox.Spannable');
+goog.require('Spannable');
 
 /**
  * Attached to the value region of a braille spannable.
@@ -46,7 +46,7 @@
 };
 
 
-cvox.Spannable.registerSerializableSpan(
+Spannable.registerSerializableSpan(
     cvox.ValueSpan,
     'cvox.ValueSpan',
     cvox.ValueSpan.fromJson,
@@ -61,9 +61,8 @@
 };
 
 
-cvox.Spannable.registerStatelessSerializableSpan(
-    cvox.ValueSelectionSpan,
-    'cvox.ValueSelectionSpan');
+Spannable.registerStatelessSerializableSpan(
+    cvox.ValueSelectionSpan, 'cvox.ValueSelectionSpan');
 
 
 /**
diff --git a/chrome/browser/resources/chromeos/chromevox/common/braille_util.js b/chrome/browser/resources/chromeos/chromevox/common/braille_util.js
index 77ace8dc..6ab38da 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/braille_util.js
+++ b/chrome/browser/resources/chromeos/chromevox/common/braille_util.js
@@ -9,13 +9,13 @@
 
 goog.provide('cvox.BrailleUtil');
 
+goog.require('Spannable');
 goog.require('cvox.ChromeVox');
 goog.require('cvox.DomUtil');
 goog.require('cvox.EditableTextAreaShadow');
 goog.require('cvox.Focuser');
 goog.require('cvox.NavBraille');
 goog.require('cvox.NodeStateUtil');
-goog.require('cvox.Spannable');
 goog.require('cvox.ValueSelectionSpan');
 goog.require('cvox.ValueSpan');
 
@@ -165,11 +165,11 @@
  * Gets the braille value of a node. A {@code cvox.ValueSpan} will be
  * attached, along with (possibly) a {@code cvox.ValueSelectionSpan}.
  * @param {Node} node The node.
- * @return {!cvox.Spannable} The value spannable.
+ * @return {!Spannable} The value spannable.
  */
 cvox.BrailleUtil.getValue = function(node) {
   if (!node) {
-    return new cvox.Spannable();
+    return new Spannable();
   }
   var valueSpan = new cvox.ValueSpan(0 /* offset */);
   if (cvox.DomUtil.isInputTypeText(node)) {
@@ -177,13 +177,13 @@
     if (node.type === 'password') {
       value = value.replace(/./g, '*');
     }
-    var spannable = new cvox.Spannable(value, valueSpan);
+    var spannable = new Spannable(value, valueSpan);
     if (node === document.activeElement &&
         cvox.DomUtil.doesInputSupportSelection(node)) {
       var selectionStart = cvox.BrailleUtil.clamp_(
-          node.selectionStart, 0, spannable.getLength());
+          node.selectionStart, 0, spannable.length);
       var selectionEnd = cvox.BrailleUtil.clamp_(
-          node.selectionEnd, 0, spannable.getLength());
+          node.selectionEnd, 0, spannable.length);
       spannable.setSpan(new cvox.ValueSelectionSpan(),
                         Math.min(selectionStart, selectionEnd),
                         Math.max(selectionStart, selectionEnd));
@@ -197,19 +197,19 @@
     var lineEnd = shadow.getLineEnd(lineIndex);
     var lineText = node.value.substring(lineStart, lineEnd);
     valueSpan.offset = lineStart;
-    var spannable = new cvox.Spannable(lineText, valueSpan);
+    var spannable = new Spannable(lineText, valueSpan);
     if (node === document.activeElement) {
       var selectionStart = cvox.BrailleUtil.clamp_(
-          node.selectionStart - lineStart, 0, spannable.getLength());
+          node.selectionStart - lineStart, 0, spannable.length);
       var selectionEnd = cvox.BrailleUtil.clamp_(
-          node.selectionEnd - lineStart, 0, spannable.getLength());
+          node.selectionEnd - lineStart, 0, spannable.length);
       spannable.setSpan(new cvox.ValueSelectionSpan(),
                         Math.min(selectionStart, selectionEnd),
                         Math.max(selectionStart, selectionEnd));
     }
     return spannable;
   } else {
-    return new cvox.Spannable(cvox.DomUtil.getValue(node), valueSpan);
+    return new Spannable(cvox.DomUtil.getValue(node), valueSpan);
   }
 };
 
@@ -219,13 +219,13 @@
  * @param {Node} prev The previous node (during navigation).
  * @param {Node} node The node.
  * @param {{name:(undefined|string),
- * role:(undefined|string),
- * roleMsg:(undefined|string),
- * state:(undefined|string),
- * container:(undefined|string),
- * value:(undefined|cvox.Spannable)}|Object=} opt_override Override a
- * specific property for the given node.
- * @return {!cvox.Spannable} The string representation.
+ *     role:(undefined|string),
+ *     roleMsg:(undefined|string),
+ *     state:(undefined|string),
+ *     container:(undefined|string),
+ *     value:(undefined|Spannable)}|Object=} opt_override Override a
+ *     specific property for the given node.
+ * @return {!Spannable} The string representation.
  */
 cvox.BrailleUtil.getTemplated = function(prev, node, opt_override) {
   opt_override = opt_override ? opt_override : {};
@@ -248,7 +248,7 @@
         Msgs.getMsg(roleMsg);
   }
 
-  var templated = new cvox.Spannable();
+  var templated = new Spannable();
   var mapChar = function(c) {
     switch (c) {
       case 'n':
@@ -273,8 +273,8 @@
     // unless the empty value has a selection, in which case the cursor
     // should be placed on the empty space after the empty value.
     if (!component.toString() && template[i + 1] == ' ' &&
-        (!(component instanceof cvox.Spannable) ||
-        !/**@type {cvox.Spannable}*/(component).getSpanInstanceOf(
+        (!(component instanceof Spannable) ||
+        !/**@type {Spannable}*/(component).getSpanInstanceOf(
             cvox.ValueSelectionSpan))) {
       i++;
     }
@@ -291,12 +291,11 @@
  * @param {number=} opt_selStart Selection start.
  * @param {number=} opt_selEnd Selection end if different from selection start.
  * @param {number=} opt_textOffset Start offset of text.
- * @return {!cvox.Spannable} The value spannable.
+ * @return {!Spannable} The value spannable.
  */
 cvox.BrailleUtil.createValue = function(text, opt_selStart, opt_selEnd,
                                         opt_textOffset) {
-  var spannable = new cvox.Spannable(
-      text, new cvox.ValueSpan(opt_textOffset || 0));
+  var spannable = new Spannable(text, new cvox.ValueSpan(opt_textOffset || 0));
   if (goog.isDef(opt_selStart)) {
     opt_selEnd = goog.isDef(opt_selEnd) ? opt_selEnd : opt_selStart;
     // TODO(plundblad): This looses the distinction between the selection
diff --git a/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.unitjs b/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.unitjs
index be935d5d..44ef24f 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.unitjs
+++ b/chrome/browser/resources/chromeos/chromevox/common/braille_util_test.unitjs
@@ -392,7 +392,7 @@
   assertUndefined(s.getSpanInstanceOf(cvox.ValueSelectionSpan));
   valueSpan = s.getSpanInstanceOf(cvox.ValueSpan);
   assertEquals(0, s.getSpanStart(valueSpan));
-  assertEquals(s.getLength(), s.getSpanEnd(valueSpan));
+  assertEquals(s.length, s.getSpanEnd(valueSpan));
 
   // Value with a carret at the start of the text.
   s = cvox.BrailleUtil.createValue('value', 0);
diff --git a/chrome/browser/resources/chromeos/chromevox/common/spannable.js b/chrome/browser/resources/chromeos/chromevox/common/spannable.js
index be77ba0..64c9656 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/spannable.js
+++ b/chrome/browser/resources/chromeos/chromevox/common/spannable.js
@@ -6,33 +6,33 @@
  * @fileoverview Class which allows construction of annotated strings.
  */
 
-goog.provide('cvox.Spannable');
+goog.provide('Spannable');
 
-goog.require('goog.object');
+goog.scope(function() {
 
 /**
  * @constructor
- * @param {string|!cvox.Spannable=} opt_string Initial value of the spannable.
+ * @param {string|!Spannable=} opt_string Initial value of the spannable.
  * @param {*=} opt_annotation Initial annotation for the entire string.
  */
-cvox.Spannable = function(opt_string, opt_annotation) {
+Spannable = function(opt_string, opt_annotation) {
   /**
    * Underlying string.
    * @type {string}
    * @private
    */
-  this.string_ = opt_string instanceof cvox.Spannable ? '' : opt_string || '';
+  this.string_ = opt_string instanceof Spannable ? '' : opt_string || '';
 
   /**
    * Spans (annotations).
-   * @type {!Array<!{ value: *, start: number, end: number }>}
+   * @type {!Array<!SpanStruct>}
    * @private
    */
   this.spans_ = [];
 
   // Append the initial spannable.
-  if (opt_string instanceof cvox.Spannable)
-  this.append(opt_string);
+  if (opt_string instanceof Spannable)
+    this.append(opt_string);
 
   // Optionally annotate the entire string.
   if (goog.isDef(opt_annotation)) {
@@ -41,355 +41,334 @@
   }
 };
 
+Spannable.prototype = {
+  /** @override */
+  toString: function() {
+    return this.string_;
+  },
 
-/** @override */
-cvox.Spannable.prototype.toString = function() {
-  return this.string_;
-};
+  /** @return {number} The length of the string */
+  get length() {
+    return this.string_.length;
+  },
 
-
-/**
- * Returns the length of the string.
- * @return {number} Length of the string.
- */
-cvox.Spannable.prototype.getLength = function() {
-  return this.string_.length;
-};
-
-
-/**
- * Adds a span to some region of the string.
- * @param {*} value Annotation.
- * @param {number} start Starting index (inclusive).
- * @param {number} end Ending index (exclusive).
- */
-cvox.Spannable.prototype.setSpan = function(value, start, end) {
-  this.removeSpan(value);
-  if (0 <= start && start <= end && end <= this.string_.length) {
-    // Zero-length spans are explicitly allowed, because it is possible to
-    // query for position by annotation as well as the reverse.
-    this.spans_.push({ value: value, start: start, end: end });
-    this.spans_.sort(function(a, b) {
-      var ret = a.start - b.start;
-      if (ret == 0)
-        ret = a.end - b.end;
-      return ret;
-    });
-  } else {
-    throw new RangeError('span out of range (start=' + start +
-        ', end=' + end + ', len=' + this.string_.length + ')');
-  }
-};
-
-
-/**
- * Removes a span.
- * @param {*} value Annotation.
- */
-cvox.Spannable.prototype.removeSpan = function(value) {
-  for (var i = this.spans_.length - 1; i >= 0; i--) {
-    if (this.spans_[i].value === value) {
-      this.spans_.splice(i, 1);
+  /**
+   * Adds a span to some region of the string.
+   * @param {*} value Annotation.
+   * @param {number} start Starting index (inclusive).
+   * @param {number} end Ending index (exclusive).
+   */
+  setSpan: function(value, start, end) {
+    this.removeSpan(value);
+    if (0 <= start && start <= end && end <= this.string_.length) {
+      // Zero-length spans are explicitly allowed, because it is possible to
+      // query for position by annotation as well as the reverse.
+      this.spans_.push({ value: value, start: start, end: end });
+      this.spans_.sort(function(a, b) {
+        var ret = a.start - b.start;
+        if (ret == 0)
+          ret = a.end - b.end;
+        return ret;
+      });
+    } else {
+      throw new RangeError('span out of range (start=' + start +
+          ', end=' + end + ', len=' + this.string_.length + ')');
     }
-  }
-};
+  },
 
-
-/**
- * Appends another Spannable or string to this one.
- * @param {string|!cvox.Spannable} other String or spannable to concatenate.
- */
-cvox.Spannable.prototype.append = function(other) {
-  if (other instanceof cvox.Spannable) {
-    var otherSpannable = /** @type {!cvox.Spannable} */ (other);
-    var originalLength = this.getLength();
-    this.string_ += otherSpannable.string_;
-    other.spans_.forEach(goog.bind(function(span) {
-      this.setSpan(
-          span.value,
-          span.start + originalLength,
-          span.end + originalLength);
-    }, this));
-  } else if (typeof other === 'string') {
-    this.string_ += /** @type {string} */ (other);
-  }
-};
-
-
-/**
- * Returns the first value matching a position.
- * @param {number} position Position to query.
- * @return {*} Value annotating that position, or undefined if none is found.
- */
-cvox.Spannable.prototype.getSpan = function(position) {
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.start <= position && position < span.end) {
-      return span.value;
-    }
-  }
-};
-
-
-/**
- * Returns the first span value which is an instance of a given constructor.
- * @param {!Function} constructor Constructor.
- * @return {!Object|undefined} Object if found; undefined otherwise.
- */
-cvox.Spannable.prototype.getSpanInstanceOf = function(constructor) {
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.value instanceof constructor) {
-      return span.value;
-    }
-  }
-};
-
-/**
- * Returns all span values which are an instance of a given constructor.
- * Spans are returned in the order of their starting index and ending index
- * for spans with equals tarting indices.
- * @param {!Function} constructor Constructor.
- * @return {!Array<Object>} Array of object.
- */
-cvox.Spannable.prototype.getSpansInstanceOf = function(constructor) {
-  var ret = [];
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.value instanceof constructor) {
-      ret.push(span.value);
-    }
-  }
-  return ret;
-};
-
-
-/**
- * Returns all spans matching a position.
- * @param {number} position Position to query.
- * @return {!Array} Values annotating that position.
- */
-cvox.Spannable.prototype.getSpans = function(position) {
-  var results = [];
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.start <= position && position < span.end) {
-      results.push(span.value);
-    }
-  }
-  return results;
-};
-
-
-/**
- * Returns the start of the requested span.
- * @param {*} value Annotation.
- * @return {number|undefined} Start of the span, or undefined if not attached.
- */
-cvox.Spannable.prototype.getSpanStart = function(value) {
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.value === value) {
-      return span.start;
-    }
-  }
-  return undefined;
-};
-
-
-/**
- * Returns the end of the requested span.
- * @param {*} value Annotation.
- * @return {number|undefined} End of the span, or undefined if not attached.
- */
-cvox.Spannable.prototype.getSpanEnd = function(value) {
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.value === value) {
-      return span.end;
-    }
-  }
-  return undefined;
-};
-
-
-/**
- * Returns a substring of this spannable.
- * Note that while similar to String#substring, this function is much less
- * permissive about its arguments. It does not accept arguments in the wrong
- * order or out of bounds.
- *
- * @param {number} start Start index, inclusive.
- * @param {number=} opt_end End index, exclusive.
- *     If excluded, the length of the string is used instead.
- * @return {!cvox.Spannable} Substring requested.
- */
-cvox.Spannable.prototype.substring = function(start, opt_end) {
-  var end = goog.isDef(opt_end) ? opt_end : this.string_.length;
-
-  if (start < 0 || end > this.string_.length || start > end) {
-    throw new RangeError('substring indices out of range');
-  }
-
-  var result = new cvox.Spannable(this.string_.substring(start, end));
-  for (var i = 0; i < this.spans_.length; i++) {
-    var span = this.spans_[i];
-    if (span.start <= end && span.end >= start) {
-      var newStart = Math.max(0, span.start - start);
-      var newEnd = Math.min(end - start, span.end - start);
-      result.spans_.push({ value: span.value, start: newStart, end: newEnd });
-    }
-  }
-  return result;
-};
-
-
-/**
- * Trims whitespace from the beginning.
- * @return {!cvox.Spannable} String with whitespace removed.
- */
-cvox.Spannable.prototype.trimLeft = function() {
-  return this.trim_(true, false);
-};
-
-
-/**
- * Trims whitespace from the end.
- * @return {!cvox.Spannable} String with whitespace removed.
- */
-cvox.Spannable.prototype.trimRight = function() {
-  return this.trim_(false, true);
-};
-
-
-/**
- * Trims whitespace from the beginning and end.
- * @return {!cvox.Spannable} String with whitespace removed.
- */
-cvox.Spannable.prototype.trim = function() {
-  return this.trim_(true, true);
-};
-
-
-/**
- * Trims whitespace from either the beginning and end or both.
- * @param {boolean} trimStart Trims whitespace from the start of a string.
- * @param {boolean} trimEnd Trims whitespace from the end of a string.
- * @return {!cvox.Spannable} String with whitespace removed.
- * @private
- */
-cvox.Spannable.prototype.trim_ = function(trimStart, trimEnd) {
-  if (!trimStart && !trimEnd) {
-    return this;
-  }
-
-  // Special-case whitespace-only strings, including the empty string.
-  // As an arbitrary decision, we treat this as trimming the whitespace off the
-  // end, rather than the beginning, of the string.
-  // This choice affects which spans are kept.
-  if (/^\s*$/.test(this.string_)) {
-    return this.substring(0, 0);
-  }
-
-  // Otherwise, we have at least one non-whitespace character to use as an
-  // anchor when trimming.
-  var trimmedStart = trimStart ? this.string_.match(/^\s*/)[0].length : 0;
-  var trimmedEnd = trimEnd ?
-      this.string_.match(/\s*$/).index : this.string_.length;
-  return this.substring(trimmedStart, trimmedEnd);
-};
-
-
-/**
- * Returns this spannable to a json serializable form, including the text and
- * span objects whose types have been registered with registerSerializableSpan
- * or registerStatelessSerializableSpan.
- * @return {!cvox.Spannable.SerializedSpannable_} the json serializable form.
- */
-cvox.Spannable.prototype.toJson = function() {
-  var result = {};
-  result.string = this.string_;
-  result.spans = [];
-  for (var i = 0; i < this.spans_.length; ++i) {
-    var span = this.spans_[i];
-    // Use linear search, since using functions as property keys
-    // is not reliable.
-    var serializeInfo = goog.object.findValue(
-        cvox.Spannable.serializableSpansByName_,
-        function(v) { return v.ctor === span.value.constructor; });
-    if (serializeInfo) {
-      var spanObj = {type: serializeInfo.name,
-                     start: span.start,
-                     end: span.end};
-      if (serializeInfo.toJson) {
-        spanObj.value = serializeInfo.toJson.apply(span.value);
+  /**
+   * Removes a span.
+   * @param {*} value Annotation.
+   */
+  removeSpan: function(value) {
+    for (var i = this.spans_.length - 1; i >= 0; i--) {
+      if (this.spans_[i].value === value) {
+        this.spans_.splice(i, 1);
       }
-      result.spans.push(spanObj);
     }
-  }
-  return result;
-};
+  },
 
+  /**
+   * Appends another Spannable or string to this one.
+   * @param {string|!Spannable} other String or spannable to concatenate.
+   */
+  append: function(other) {
+    if (other instanceof Spannable) {
+      var otherSpannable = /** @type {!Spannable} */ (other);
+      var originalLength = this.length;
+      this.string_ += otherSpannable.string_;
+      other.spans_.forEach(function(span) {
+        this.setSpan(
+            span.value,
+            span.start + originalLength,
+            span.end + originalLength);
+      }.bind(this));
+    } else if (typeof other === 'string') {
+      this.string_ += /** @type {string} */ (other);
+    }
+  },
+
+  /**
+   * Returns the first value matching a position.
+   * @param {number} position Position to query.
+   * @return {*} Value annotating that position, or undefined if none is found.
+   */
+  getSpan: function(position) {
+    return valueOfSpan(this.spans_.find(spanCoversPosition(position)));
+  },
+
+  /**
+   * Returns the first span value which is an instance of a given constructor.
+   * @param {!Function} constructor Constructor.
+   * @return {*} Object if found; undefined otherwise.
+   */
+  getSpanInstanceOf: function(constructor) {
+    return valueOfSpan(this.spans_.find(spanInstanceOf(constructor)));
+  },
+
+  /**
+   * Returns all span values which are an instance of a given constructor.
+   * Spans are returned in the order of their starting index and ending index
+   * for spans with equals tarting indices.
+   * @param {!Function} constructor Constructor.
+   * @return {!Array<Object>} Array of object.
+   */
+  getSpansInstanceOf: function(constructor) {
+    return (this.spans_.filter(spanInstanceOf(constructor))
+            .map(valueOfSpan));
+  },
+
+  /**
+   * Returns all spans matching a position.
+   * @param {number} position Position to query.
+   * @return {!Array} Values annotating that position.
+   */
+  getSpans: function(position) {
+    return (this.spans_
+        .filter(spanCoversPosition(position))
+        .map(valueOfSpan));
+  },
+
+  /**
+   * Returns whether a span is contained in this object.
+   * @param {*} value Annotation.
+   * @return {boolean}
+   */
+  hasSpan: function(value) {
+    return this.spans_.some(spanValueIs(value));
+  },
+
+  /**
+   * Returns the start of the requested span. Throws if the span doesn't exist
+   * in this object.
+   * @param {*} value Annotation.
+   * @return {number}
+   */
+  getSpanStart: function(value) {
+    return this.getSpanByValueOrThrow_(value).start;
+  },
+
+  /**
+   * Returns the end of the requested span. Throws if the span doesn't exist
+   * in this object.
+   * @param {*} value Annotation.
+   * @return {number}
+   */
+  getSpanEnd: function(value) {
+    return this.getSpanByValueOrThrow_(value).end;
+  },
+
+  /**
+   * Returns the number of characters covered by the given span. Throws if
+   * the span is not in this object.
+   * @param {*} value
+   * @return {number}
+   */
+  getSpanLength: function(value) {
+    var span = this.getSpanByValueOrThrow_(value);
+    return span.end - span.start;
+  },
+
+  /**
+   * Gets the internal object for a span or throws if the span doesn't exist.
+   * @param {*} value The annotation.
+   * @return {!SpanStruct}
+   * @private
+   */
+  getSpanByValueOrThrow_: function(value) {
+    var span = this.spans_.find(spanValueIs(value));
+    if (span)
+      return span;
+    throw new Error('Span ' + value + ' doesn\'t exist in spannable');
+  },
+
+  /**
+   * Returns a substring of this spannable.
+   * Note that while similar to String#substring, this function is much less
+   * permissive about its arguments. It does not accept arguments in the wrong
+   * order or out of bounds.
+   *
+   * @param {number} start Start index, inclusive.
+   * @param {number=} opt_end End index, exclusive.
+   *     If excluded, the length of the string is used instead.
+   * @return {!Spannable} Substring requested.
+   */
+  substring: function(start, opt_end) {
+    var end = goog.isDef(opt_end) ? opt_end : this.string_.length;
+
+    if (start < 0 || end > this.string_.length || start > end) {
+      throw new RangeError('substring indices out of range');
+    }
+
+    var result = new Spannable(this.string_.substring(start, end));
+    this.spans_.forEach(function(span) {
+      if (span.start <= end && span.end >= start) {
+        var newStart = Math.max(0, span.start - start);
+        var newEnd = Math.min(end - start, span.end - start);
+        result.spans_.push({ value: span.value, start: newStart, end: newEnd });
+      }
+    });
+    return result;
+  },
+
+  /**
+   * Trims whitespace from the beginning.
+   * @return {!Spannable} String with whitespace removed.
+   */
+  trimLeft: function() {
+    return this.trim_(true, false);
+  },
+
+  /**
+   * Trims whitespace from the end.
+   * @return {!Spannable} String with whitespace removed.
+   */
+  trimRight: function() {
+    return this.trim_(false, true);
+  },
+
+  /**
+   * Trims whitespace from the beginning and end.
+   * @return {!Spannable} String with whitespace removed.
+   */
+  trim: function() {
+    return this.trim_(true, true);
+  },
+
+  /**
+   * Trims whitespace from either the beginning and end or both.
+   * @param {boolean} trimStart Trims whitespace from the start of a string.
+   * @param {boolean} trimEnd Trims whitespace from the end of a string.
+   * @return {!Spannable} String with whitespace removed.
+   * @private
+   */
+  trim_: function(trimStart, trimEnd) {
+    if (!trimStart && !trimEnd) {
+      return this;
+    }
+
+    // Special-case whitespace-only strings, including the empty string.
+    // As an arbitrary decision, we treat this as trimming the whitespace off
+    // the end, rather than the beginning, of the string.
+    // This choice affects which spans are kept.
+    if (/^\s*$/.test(this.string_)) {
+      return this.substring(0, 0);
+    }
+
+    // Otherwise, we have at least one non-whitespace character to use as an
+    // anchor when trimming.
+    var trimmedStart = trimStart ? this.string_.match(/^\s*/)[0].length : 0;
+    var trimmedEnd = trimEnd ?
+        this.string_.match(/\s*$/).index : this.string_.length;
+    return this.substring(trimmedStart, trimmedEnd);
+  },
+
+  /**
+   * Returns this spannable to a json serializable form, including the text and
+   * span objects whose types have been registered with registerSerializableSpan
+   * or registerStatelessSerializableSpan.
+   * @return {!SerializedSpannable} the json serializable form.
+   */
+  toJson: function() {
+    var result = {};
+    result.string = this.string_;
+    result.spans = [];
+    this.spans_.forEach(function(span) {
+      var serializeInfo = serializableSpansByConstructor.get(
+          span.value.constructor);
+      if (serializeInfo) {
+        var spanObj = {type: serializeInfo.name,
+                       start: span.start,
+                       end: span.end};
+        if (serializeInfo.toJson) {
+          spanObj.value = serializeInfo.toJson.apply(span.value);
+        }
+        result.spans.push(spanObj);
+      }
+    });
+    return result;
+  }
+};
 
 /**
  * Creates a spannable from a json serializable representation.
- * @param {!cvox.Spannable.SerializedSpannable_} obj object containing the
- *     serializable representation.
- * @return {!cvox.Spannable}
+ * @param {!SerializedSpannable} obj object containing the serializable
+ *     representation.
+ * @return {!Spannable}
  */
-cvox.Spannable.fromJson = function(obj) {
+Spannable.fromJson = function(obj) {
   if (typeof obj.string !== 'string') {
-    throw 'Invalid spannable json object: string field not a string';
+    throw new Error(
+        'Invalid spannable json object: string field not a string');
   }
   if (!(obj.spans instanceof Array)) {
-    throw 'Invalid spannable json object: no spans array';
+    throw new Error('Invalid spannable json object: no spans array');
   }
-  var result = new cvox.Spannable(obj.string);
-  for (var i = 0, span; span = obj.spans[i]; ++i) {
+  var result = new Spannable(obj.string);
+  result.spans_ = obj.spans.map(function(span) {
     if (typeof span.type !== 'string') {
-      throw 'Invalid span in spannable json object: type not a string';
+      throw new Error(
+          'Invalid span in spannable json object: type not a string');
     }
     if (typeof span.start !== 'number' || typeof span.end !== 'number') {
-      throw 'Invalid span in spannable json object: start or end not a number';
+      throw new Error(
+          'Invalid span in spannable json object: start or end not a number');
     }
-    var serializeInfo = cvox.Spannable.serializableSpansByName_[span.type];
+    var serializeInfo = serializableSpansByName.get(span.type);
     var value = serializeInfo.fromJson(span.value);
-    result.setSpan(value, span.start, span.end);
-  }
+    return {value: value, start: span.start, end: span.end};
+  });
   return result;
 };
 
-
 /**
  * Registers a type that can be converted to a json serializable format.
  * @param {!Function} constructor The type of object that can be converted.
  * @param {string} name String identifier used in the serializable format.
  * @param {function(!Object): !Object} fromJson A function that converts
  *     the serializable object to an actual object of this type.
- * @param {function(!Object): !Object} toJson A function that converts
- *     this object to a json serializable object.  The function will
- *     be called with this set to the object to convert.
+ * @param {function(): !Object} toJson A function that converts this object to
+ *     a json serializable object. The function will be called with |this| set
+ *     to the object to convert.
  */
-cvox.Spannable.registerSerializableSpan = function(
+Spannable.registerSerializableSpan = function(
     constructor, name, fromJson, toJson) {
-  var obj = {name: name, ctor: constructor,
-             fromJson: fromJson, toJson: toJson};
-  cvox.Spannable.serializableSpansByName_[name] = obj;
+  var obj = {name: name, fromJson: fromJson, toJson: toJson};
+  serializableSpansByName.set(name, obj);
+  serializableSpansByConstructor.set(constructor, obj);
 };
 
-
 /**
  * Registers an object type that can be converted to/from a json serializable
- * form.  Objects of this type carry no state that will be preserved
+ * form. Objects of this type carry no state that will be preserved
  * when serialized.
  * @param {!Function} constructor The type of the object that can be converted.
  *     This constructor will be called with no arguments to construct
  *     new objects.
  * @param {string} name Name of the type used in the serializable object.
  */
-cvox.Spannable.registerStatelessSerializableSpan = function(
-    constructor, name) {
-  var obj = {name: name, ctor: constructor, toJson: undefined};
+Spannable.registerStatelessSerializableSpan = function(constructor, name) {
+  var obj = {name: name, toJson: undefined};
   /**
    * @param {!Object} obj
    * @return {!Object}
@@ -397,38 +376,87 @@
   obj.fromJson = function(obj) {
      return new constructor();
   };
-  cvox.Spannable.serializableSpansByName_[name] = obj;
+  serializableSpansByName.set(name, obj);
+  serializableSpansByConstructor.set(constructor, obj);
 };
 
+/**
+ * An annotation with its start and end points.
+ * @typedef {{value: *, start: number, end: number}}
+ */
+var SpanStruct;
 
 /**
  * Describes how to convert a span type to/from serializable json.
- * @typedef {{ctor: !Function, name: string,
- *             fromJson: function(!Object): !Object,
- *             toJson: ((function(!Object): !Object)|undefined)}}
- * @private
+ * @typedef {{name: string,
+ *            fromJson: function(!Object): !Object,
+ *            toJson: ((function(): !Object)|undefined)}}
  */
-cvox.Spannable.SerializeInfo_;
-
+var SerializeInfo;
 
 /**
  * The serialized format of a spannable.
- * @typedef {{string: string, spans: Array<cvox.Spannable.SerializedSpan_>}}
+ * @typedef {{string: string, spans: Array<SerializedSpan>}}
  * @private
  */
-cvox.Spannable.SerializedSpannable_;
-
+var SerializedSpannable;
 
 /**
  * The format of a single annotation in a serialized spannable.
  * @typedef {{type: string, value: !Object, start: number, end: number}}
- * @private
  */
-cvox.Spannable.SerializedSpan_;
+var SerializedSpan;
 
 /**
  * Maps type names to serialization info objects.
- * @type {Object<cvox.Spannable.SerializeInfo_>}
- * @private
+ * @type {Map<string, SerializeInfo>}
  */
-cvox.Spannable.serializableSpansByName_ = {};
+var serializableSpansByName = new Map();
+
+/**
+ * Maps constructors to serialization info objects.
+ * @type {Map<Function, SerializeInfo>}
+ */
+var serializableSpansByConstructor = new Map();
+
+// Helpers for implementing the various |get*| methods of |Spannable|.
+
+/**
+ * @param {Function} constructor
+ * @return {function(SpanStruct): boolean}
+ */
+function spanInstanceOf(constructor) {
+  return function(span) {
+    return span.value instanceof constructor;
+  }
+}
+
+/**
+ * @param {number} position
+ * @return {function(SpanStruct): boolean}
+ */
+function spanCoversPosition(position) {
+  return function(span) {
+    return span.start <= position && position < span.end;
+  }
+}
+
+/**
+ * @param {*} value
+ * @return {function(SpanStruct): boolean}
+ */
+function spanValueIs(value) {
+  return function(span) {
+    return span.value === value;
+  }
+}
+
+/**
+ * @param {!SpanStruct|undefined} span
+ * @return {*}
+ */
+function valueOfSpan(span) {
+  return span ? span.value : undefined;
+}
+
+});
diff --git a/chrome/browser/resources/chromeos/chromevox/common/spannable_test.unitjs b/chrome/browser/resources/chromeos/chromevox/common/spannable_test.unitjs
index 8a26cfeb..15347e1 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/spannable_test.unitjs
+++ b/chrome/browser/resources/chromeos/chromevox/common/spannable_test.unitjs
@@ -30,6 +30,32 @@
 };
 
 /**
+ * @param {Spannable} spannable
+ * @param {*} annotation
+ */
+function assertSpanNotFound(spannable, annotation) {
+  assertFalse(spannable.hasSpan(annotation));
+  assertException(
+      'Span ' + annotation + ' shouldn\'t be in spannable ' + spannable,
+      function() {
+        spannable.getSpanStart(annotation);
+      },
+      'Error');
+  assertException(
+      'Span ' + annotation + ' shouldn\'t be in spannable ' + spannable,
+      function() {
+        spannable.getSpanEnd(annotation);
+      },
+      'Error');
+  assertException(
+      'Span ' + annotation + ' shouldn\'t be in spannable ' + spannable,
+      function() {
+        spannable.getSpanLength(annotation);
+      },
+      'Error');
+}
+
+/**
  * Test fixture.
  * @constructor
  * @extends {ChromeVoxUnitTestBase}
@@ -41,15 +67,15 @@
 
   /** @override */
   closureModuleDeps: [
-    'cvox.Spannable',
+    'Spannable',
   ],
 
   /** @override */
   setUp: function() {
-    cvox.Spannable.registerStatelessSerializableSpan(
+    Spannable.registerStatelessSerializableSpan(
         StatelessSerializableSpan, 'StatelessSerializableSpan');
 
-    cvox.Spannable.registerSerializableSpan(
+    Spannable.registerSerializableSpan(
         NonStatelessSerializableSpan, 'NonStatelessSerializableSpan',
         NonStatelessSerializableSpan.fromJson,
         NonStatelessSerializableSpan.prototype.toJson);
@@ -57,33 +83,34 @@
 };
 
 TEST_F('CvoxSpannableUnitTest', 'ToStringUnannotated', function() {
-  assertEquals('', new cvox.Spannable().toString());
-  assertEquals('hello world', new cvox.Spannable('hello world').toString());
+  assertEquals('', new Spannable().toString());
+  assertEquals('hello world', new Spannable('hello world').toString());
 });
 
 /** Tests that toString works correctly on annotated strings. */
 TEST_F('CvoxSpannableUnitTest', 'ToStringAnnotated', function() {
-  var spannable = new cvox.Spannable('Hello Google');
+  var spannable = new Spannable('Hello Google');
   spannable.setSpan('http://www.google.com/', 6, 12);
   assertEquals('Hello Google', spannable.toString());
 });
 
 /** Tests the length calculation. */
-TEST_F('CvoxSpannableUnitTest', 'GetLength', function() {
-  var spannable = new cvox.Spannable('Hello');
+TEST_F('CvoxSpannableUnitTest', 'LengthProperty', function() {
+  var spannable = new Spannable('Hello');
   spannable.setSpan({}, 0, 3);
-  assertEquals(5, spannable.getLength());
+  assertEquals(5, spannable.length);
   spannable.append(' world');
-  assertEquals(11, spannable.getLength());
-  spannable.append(new cvox.Spannable(' from cvox.Spannable'));
-  assertEquals(31, spannable.getLength());
+  assertEquals(11, spannable.length);
+  spannable.append(new Spannable(' from Spannable'));
+  assertEquals(26, spannable.length);
 });
 
 /** Tests that a span can be added and retrieved at the beginning. */
 TEST_F('CvoxSpannableUnitTest', 'SpanBeginning', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(annotation, 0, 5);
+  assertTrue(spannable.hasSpan(annotation));
   assertSame(annotation, spannable.getSpan(0));
   assertSame(annotation, spannable.getSpan(3));
   assertUndefined(spannable.getSpan(5));
@@ -93,8 +120,9 @@
 /** Tests that a span can be added and retrieved at the beginning. */
 TEST_F('CvoxSpannableUnitTest', 'SpanEnd', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(annotation, 6, 11);
+  assertTrue(spannable.hasSpan(annotation));
   assertUndefined(spannable.getSpan(3));
   assertUndefined(spannable.getSpan(5));
   assertSame(annotation, spannable.getSpan(6));
@@ -104,8 +132,9 @@
 /** Tests that a zero-length span is not retrieved. */
 TEST_F('CvoxSpannableUnitTest', 'SpanZeroLength', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(annotation, 3, 3);
+  assertTrue(spannable.hasSpan(annotation));
   assertUndefined(spannable.getSpan(2));
   assertUndefined(spannable.getSpan(3));
   assertUndefined(spannable.getSpan(4));
@@ -114,17 +143,18 @@
 /** Tests that a removed span is not returned. */
 TEST_F('CvoxSpannableUnitTest', 'RemoveSpan', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(annotation, 0, 3);
   assertSame(annotation, spannable.getSpan(1));
   spannable.removeSpan(annotation);
+  assertFalse(spannable.hasSpan(annotation));
   assertUndefined(spannable.getSpan(1));
 });
 
 /** Tests that adding a span in one place removes it from another. */
 TEST_F('CvoxSpannableUnitTest', 'SetSpanMoves', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(annotation, 0, 3);
   assertSame(annotation, spannable.getSpan(1));
   assertUndefined(spannable.getSpan(4));
@@ -135,7 +165,7 @@
 
 /** Tests that setSpan objects to out-of-range arguments. */
 TEST_F('CvoxSpannableUnitTest', 'SetSpanRangeError', function() {
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
 
   // Start index out of range.
   assertException('expected range error', function() {
@@ -161,7 +191,7 @@
   var annotation1 = { number: 1 };
   var annotation2 = { number: 2 };
   assertNotSame(annotation1, annotation2);
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(annotation1, 1, 4);
   spannable.setSpan(annotation2, 2, 7);
   assertSame(annotation1, spannable.getSpan(1));
@@ -174,11 +204,11 @@
 
 /** Tests that appending appends the strings. */
 TEST_F('CvoxSpannableUnitTest', 'AppendToString', function() {
-  var spannable = new cvox.Spannable('Google');
+  var spannable = new Spannable('Google');
   assertEquals('Google', spannable.toString());
   spannable.append(' Chrome');
   assertEquals('Google Chrome', spannable.toString());
-  spannable.append(new cvox.Spannable('Vox'));
+  spannable.append(new Spannable('Vox'));
   assertEquals('Google ChromeVox', spannable.toString());
 });
 
@@ -189,9 +219,9 @@
   var annotation1 = { number: 1 };
   var annotation2 = { number: 2 };
   assertNotSame(annotation1, annotation2);
-  var left = new cvox.Spannable('hello');
+  var left = new Spannable('hello');
   left.setSpan(annotation1, 0, 3);
-  var right = new cvox.Spannable(' world');
+  var right = new Spannable(' world');
   right.setSpan(annotation2, 0, 3);
   left.append(right);
   assertSame(annotation1, left.getSpan(1));
@@ -201,33 +231,35 @@
 /**
  * Tests that a span's bounds can be retrieved.
  */
-TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEnd', function() {
+TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndAndLength', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('potato wedges');
+  var spannable = new Spannable('potato wedges');
   spannable.setSpan(annotation, 8, 12);
   assertEquals(8, spannable.getSpanStart(annotation));
   assertEquals(12, spannable.getSpanEnd(annotation));
+  assertEquals(4, spannable.getSpanLength(annotation));
 });
 
 /**
  * Tests that an absent span's bounds are reported correctly.
  */
-TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndAbsent', function() {
+TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndAndLengthAbsent', function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('potato wedges');
-  assertUndefined(spannable.getSpanStart(annotation));
-  assertUndefined(spannable.getSpanEnd(annotation));
+  var spannable = new Spannable('potato wedges');
+  assertSpanNotFound(spannable, annotation);
 });
 
 /**
  * Test that a zero length span can still be found.
  */
-TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndZeroLength', function() {
+TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndAndLengthZeroLength',
+       function() {
   var annotation = {};
-  var spannable = new cvox.Spannable('potato wedges');
+  var spannable = new Spannable('potato wedges');
   spannable.setSpan(annotation, 8, 8);
   assertEquals(8, spannable.getSpanStart(annotation));
   assertEquals(8, spannable.getSpanEnd(annotation));
+  assertEquals(0, spannable.getSpanLength(annotation));
 });
 
 /**
@@ -236,7 +268,7 @@
  */
 TEST_F('CvoxSpannableUnitTest', 'GetSpanStartAndEndEquality', function() {
   // Note that 0 == '' and '' == 0 in JavaScript.
-  var spannable = new cvox.Spannable('wat');
+  var spannable = new Spannable('wat');
   spannable.setSpan(0, 0, 0);
   spannable.setSpan('', 1, 3);
   assertEquals(0, spannable.getSpanStart(0));
@@ -250,7 +282,7 @@
  */
 TEST_F('CvoxSpannableUnitTest', 'Substring', function() {
   var assertSubstringResult = function(expected, initial, start, opt_end) {
-    var spannable = new cvox.Spannable(initial);
+    var spannable = new Spannable(initial);
     var substring = spannable.substring(start, opt_end);
     assertEquals(expected, substring.toString());
   };
@@ -265,7 +297,7 @@
  */
 TEST_F('CvoxSpannableUnitTest', 'SubstringRangeError', function() {
   var assertRangeError = function(initial, start, opt_end) {
-    var spannable = new cvox.Spannable(initial);
+    var spannable = new Spannable(initial);
     assertException('expected range error', function() {
       spannable.substring(start, opt_end);
     }, 'RangeError');
@@ -282,9 +314,10 @@
   var assertSpanIncluded = function(expectedSpanStart, expectedSpanEnd,
       initial, initialSpanStart, initialSpanEnd, start, opt_end) {
     var annotation = {};
-    var spannable = new cvox.Spannable(initial);
+    var spannable = new Spannable(initial);
     spannable.setSpan(annotation, initialSpanStart, initialSpanEnd);
     var substring = spannable.substring(start, opt_end);
+    assertTrue(substring.hasSpan(annotation));
     assertEquals(expectedSpanStart, substring.getSpanStart(annotation));
     assertEquals(expectedSpanEnd, substring.getSpanEnd(annotation));
   };
@@ -314,11 +347,10 @@
   var assertSpanExcluded = function(initial, spanStart, spanEnd,
       start, opt_end) {
     var annotation = {};
-    var spannable = new cvox.Spannable(initial);
+    var spannable = new Spannable(initial);
     spannable.setSpan(annotation, spanStart, spanEnd);
     var substring = spannable.substring(start, opt_end);
-    assertUndefined(substring.getSpanStart(annotation));
-    assertUndefined(substring.getSpanEnd(annotation));
+    assertSpanNotFound(substring, annotation);
   };
   assertSpanExcluded('potato wedges', 8, 12, 0, 6);
   assertSpanExcluded('potato wedges', 7, 12, 0, 6);
@@ -333,7 +365,7 @@
   var assertSpanIncluded = function(expectedSpanStart, expectedSpanEnd,
       initial, initialSpanStart, initialSpanEnd, start, opt_end) {
     var annotation = {};
-    var spannable = new cvox.Spannable(initial);
+    var spannable = new Spannable(initial);
     spannable.setSpan(annotation, initialSpanStart, initialSpanEnd);
     var substring = spannable.substring(start, opt_end);
     assertEquals(expectedSpanStart, substring.getSpanStart(annotation));
@@ -345,7 +377,7 @@
 
   // The first of the above should produce "edge".
   assertEquals('edge',
-      new cvox.Spannable('potato wedges').substring(8, 12).toString());
+      new Spannable('potato wedges').substring(8, 12).toString());
 });
 
 /**
@@ -353,7 +385,7 @@
  */
 TEST_F('CvoxSpannableUnitTest', 'Trim', function() {
   var assertTrimResult = function(expected, initial) {
-    assertEquals(expected, new cvox.Spannable(initial).trim().toString());
+    assertEquals(expected, new Spannable(initial).trim().toString());
   };
   assertTrimResult('John F. Kennedy', 'John F. Kennedy');
   assertTrimResult('John F. Kennedy', '  John F. Kennedy');
@@ -367,13 +399,12 @@
  * Tests that trim keeps, drops and clips spans.
  */
 TEST_F('CvoxSpannableUnitTest', 'TrimSpans', function() {
-  var spannable = new cvox.Spannable(' \t Kennedy\n');
+  var spannable = new Spannable(' \t Kennedy\n');
   spannable.setSpan('tab', 1, 2);
   spannable.setSpan('jfk', 3, 10);
   spannable.setSpan('jfk-newline', 3, 11);
   var trimmed = spannable.trim();
-  assertUndefined(trimmed.getSpanStart('tab'));
-  assertUndefined(trimmed.getSpanEnd('tab'));
+  assertSpanNotFound(trimmed, 'tab');
   assertEquals(0, trimmed.getSpanStart('jfk'));
   assertEquals(7, trimmed.getSpanEnd('jfk'));
   assertEquals(0, trimmed.getSpanStart('jfk-newline'));
@@ -384,14 +415,13 @@
  * Tests that when a string is all whitespace, we trim off the *end*.
  */
 TEST_F('CvoxSpannableUnitTest', 'TrimAllWhitespace', function() {
-  var spannable = new cvox.Spannable('    ');
+  var spannable = new Spannable('    ');
   spannable.setSpan('cursor 1', 0, 0);
   spannable.setSpan('cursor 2', 2, 2);
   var trimmed = spannable.trim();
   assertEquals(0, trimmed.getSpanStart('cursor 1'));
   assertEquals(0, trimmed.getSpanEnd('cursor 1'));
-  assertUndefined(trimmed.getSpanStart('cursor 2'));
-  assertUndefined(trimmed.getSpanEnd('cursor 2'));
+  assertSpanNotFound(trimmed, 'cursor 2');
 });
 
 /**
@@ -407,7 +437,7 @@
   ExampleConstructor3.prototype = new ExampleConstructorBase();
   var ex1 = new ExampleConstructor1();
   var ex2 = new ExampleConstructor2();
-  var spannable = new cvox.Spannable('Hello world');
+  var spannable = new Spannable('Hello world');
   spannable.setSpan(ex1, 0, 0);
   spannable.setSpan(ex2, 1, 1);
   assertEquals(ex1, spannable.getSpanInstanceOf(ExampleConstructor1));
@@ -418,16 +448,15 @@
 
 /** Tests trimming only left or right. */
 TEST_F('CvoxSpannableUnitTest', 'TrimLeftOrRight', function() {
-  var spannable = new cvox.Spannable('    ');
+  var spannable = new Spannable('    ');
   spannable.setSpan('cursor 1', 0, 0);
   spannable.setSpan('cursor 2', 2, 2);
   var trimmed = spannable.trimLeft();
   assertEquals(0, trimmed.getSpanStart('cursor 1'));
   assertEquals(0, trimmed.getSpanEnd('cursor 1'));
-  assertUndefined(trimmed.getSpanStart('cursor 2'));
-  assertUndefined(trimmed.getSpanEnd('cursor 2'));
+  assertSpanNotFound(trimmed, 'cursor 2');
 
-  var spannable2 = new cvox.Spannable('0  ');
+  var spannable2 = new Spannable('0  ');
   spannable2.setSpan('cursor 1', 0, 0);
   spannable2.setSpan('cursor 2', 2, 2);
   var trimmed2 = spannable2.trimLeft();
@@ -438,10 +467,9 @@
   trimmed2 = trimmed2.trimRight();
   assertEquals(0, trimmed2.getSpanStart('cursor 1'));
   assertEquals(0, trimmed2.getSpanEnd('cursor 1'));
-  assertUndefined(trimmed2.getSpanStart('cursor 2'));
-  assertUndefined(trimmed2.getSpanEnd('cursor 2'));
+  assertSpanNotFound(trimmed2, 'cursor 2');
 
-  var spannable3 = new cvox.Spannable('  0');
+  var spannable3 = new Spannable('  0');
   spannable3.setSpan('cursor 1', 0, 0);
   spannable3.setSpan('cursor 2', 2, 2);
   var trimmed3 = spannable3.trimRight();
@@ -450,20 +478,19 @@
   assertEquals(2, trimmed3.getSpanStart('cursor 2'));
   assertEquals(2, trimmed3.getSpanEnd('cursor 2'));
   trimmed3 = trimmed3.trimLeft();
-  assertUndefined(trimmed3.getSpanStart('cursor 1'));
-  assertUndefined(trimmed3.getSpanEnd('cursor 1'));
+  assertSpanNotFound(trimmed3, 'cursor 1');
   assertEquals(0, trimmed3.getSpanStart('cursor 2'));
   assertEquals(0, trimmed3.getSpanEnd('cursor 2'));
 });
 
 TEST_F('CvoxSpannableUnitTest', 'Serialize', function() {
-  var fresh = new cvox.Spannable('text');
+  var fresh = new Spannable('text');
   var freshStatelessSerializable = new StatelessSerializableSpan();
   var freshNonStatelessSerializable = new NonStatelessSerializableSpan(14);
   fresh.setSpan(new UnserializableSpan(), 0, 1);
   fresh.setSpan(freshStatelessSerializable, 0, 2);
   fresh.setSpan(freshNonStatelessSerializable, 3, 4);
-  var thawn = cvox.Spannable.fromJson(fresh.toJson());
+  var thawn = Spannable.fromJson(fresh.toJson());
   var thawnStatelessSerializable = thawn.getSpanInstanceOf(
       StatelessSerializableSpan);
   var thawnNonStatelessSerializable = thawn.getSpanInstanceOf(
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
index abe9f8a..424cfda 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
@@ -597,26 +597,26 @@
   },
 
   /**
-   * @param {!cvox.Spannable} text
+   * @param {!Spannable} text
    * @param {number} position
    * @private
    */
   brailleRoutingCommand_: function(text, position) {
-    var actionNode = null;
+    var actionNodeSpan = null;
     var selectionSpan = null;
     text.getSpans(position).forEach(function(span) {
       if (span instanceof Output.SelectionSpan) {
         selectionSpan = span;
       } else if (span instanceof Output.NodeSpan) {
-        if (!actionNode ||
-            (text.getSpanEnd(actionNode) - text.getSpanStart(actionNode) >
-            text.getSpanEnd(span) - text.getSpanStart(span))) {
-          actionNode = span.node;
+        if (!actionNodeSpan ||
+            text.getSpanLength(span) <= text.getSpanLength(actionNodeSpan)) {
+          actionNodeSpan = span;
         }
       }
     });
-    if (!actionNode)
+    if (!actionNodeSpan)
       return;
+    var actionNode = actionNodeSpan.node;
     if (actionNode.role === RoleType.inlineTextBox)
       actionNode = actionNode.parent;
     actionNode.doDefault();
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index 74949054..16006e7 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -11,12 +11,12 @@
 
 goog.require('AutomationUtil.Dir');
 goog.require('EarconEngine');
+goog.require('Spannable');
 goog.require('cursors.Cursor');
 goog.require('cursors.Range');
 goog.require('cursors.Unit');
 goog.require('cvox.AbstractEarcons');
 goog.require('cvox.NavBraille');
-goog.require('cvox.Spannable');
 goog.require('cvox.ValueSelectionSpan');
 goog.require('cvox.ValueSpan');
 goog.require('goog.i18n.MessageFormat');
@@ -26,7 +26,7 @@
 
 /**
  * An Output object formats a cursors.Range into speech, braille, or both
- * representations. This is typically a cvox.Spannable.
+ * representations. This is typically a |Spannable|.
  *
  * The translation from Range to these output representations rely upon format
  * rules which specify how to convert AutomationNode objects into annotated
@@ -52,9 +52,9 @@
  */
 Output = function() {
   // TODO(dtseng): Include braille specific rules.
-  /** @type {!Array<!cvox.Spannable>} */
+  /** @type {!Array<!Spannable>} */
   this.speechBuffer_ = [];
-  /** @type {!Array<!cvox.Spannable>} */
+  /** @type {!Array<!Spannable>} */
   this.brailleBuffer_ = [];
   /** @type {!Array<!Object>} */
   this.locations_ = [];
@@ -585,7 +585,7 @@
 Output.prototype = {
   /**
    * Gets the spoken output with separator '|'.
-   * @return {!cvox.Spannable}
+   * @return {!Spannable}
    */
   get speechOutputForTest() {
     return this.speechBuffer_.reduce(function(prev, cur) {
@@ -599,7 +599,7 @@
 
   /**
    * Gets the output buffer for braille.
-   * @return {!cvox.Spannable}
+   * @return {!Spannable}
    */
   get brailleOutputForTest() {
     return this.createBrailleOutput_();
@@ -718,11 +718,8 @@
           buff.getSpanInstanceOf(Output.SelectionSpan);
       var startIndex = -1, endIndex = -1;
       if (selSpan) {
-        // Casts ok, since the span is known to be in the spannable.
-        var valueStart =
-            /** @type {number} */ (buff.getSpanStart(selSpan));
-        var valueEnd =
-            /** @type {number} */ (buff.getSpanEnd(selSpan));
+        var valueStart = buff.getSpanStart(selSpan);
+        var valueEnd = buff.getSpanEnd(selSpan);
         startIndex = valueStart + selSpan.startIndex;
         endIndex = valueStart + selSpan.endIndex;
         buff.setSpan(new cvox.ValueSpan(0), valueStart, valueEnd);
@@ -748,7 +745,7 @@
    * @param {!cursors.Range} range
    * @param {cursors.Range} prevRange
    * @param {chrome.automation.EventType|string} type
-   * @param {!Array<cvox.Spannable>} buff Buffer to receive rendered output.
+   * @param {!Array<Spannable>} buff Buffer to receive rendered output.
    * @private
    */
   render_: function(range, prevRange, type, buff) {
@@ -763,7 +760,7 @@
    * @param {chrome.automation.AutomationNode} node
    * @param {string|!Object} format The output format either specified as an
    * output template string or a parsed output format tree.
-   * @param {!Array<cvox.Spannable>} buff Buffer to receive rendered output.
+   * @param {!Array<Spannable>} buff Buffer to receive rendered output.
    * @param {!Object=} opt_exclude A set of attributes to exclude.
    * @private
    */
@@ -1042,7 +1039,7 @@
    * @param {!cursors.Range} range
    * @param {cursors.Range} prevRange
    * @param {chrome.automation.EventType|string} type
-   * @param {!Array<cvox.Spannable>} rangeBuff
+   * @param {!Array<Spannable>} rangeBuff
    * @private
    */
   range_: function(range, prevRange, type, rangeBuff) {
@@ -1080,7 +1077,7 @@
    * @param {!chrome.automation.AutomationNode} node
    * @param {!chrome.automation.AutomationNode} prevNode
    * @param {chrome.automation.EventType|string} type
-   * @param {!Array<cvox.Spannable>} buff
+   * @param {!Array<Spannable>} buff
    * @param {!Object=} opt_exclude A list of attributes to exclude from
    * processing.
    * @private
@@ -1152,7 +1149,7 @@
    * @param {!chrome.automation.AutomationNode} node
    * @param {!chrome.automation.AutomationNode} prevNode
    * @param {chrome.automation.EventType|string} type
-   * @param {!Array<cvox.Spannable>} buff
+   * @param {!Array<Spannable>} buff
    * @private
    */
   node_: function(node, prevNode, type, buff) {
@@ -1167,7 +1164,7 @@
    * @param {!cursors.Range} range
    * @param {cursors.Range} prevRange
    * @param {chrome.automation.EventType|string} type
-   * @param {!Array<cvox.Spannable>} buff
+   * @param {!Array<Spannable>} buff
    * @private
    */
   subNode_: function(range, prevRange, type, buff) {
@@ -1188,8 +1185,8 @@
 
   /**
    * Appends output to the |buff|.
-   * @param {!Array<cvox.Spannable>} buff
-   * @param {string|!cvox.Spannable} value
+   * @param {!Array<Spannable>} buff
+   * @param {string|!Spannable} value
    * @param {{isUnique: (boolean|undefined),
    *      annotation: !Array<*>}=} opt_options
    */
@@ -1200,9 +1197,9 @@
     if ((!value || value.length == 0) && opt_options.annotation.length == 0)
       return;
 
-    var spannableToAdd = new cvox.Spannable(value);
+    var spannableToAdd = new Spannable(value);
     opt_options.annotation.forEach(function(a) {
-      spannableToAdd.setSpan(a, 0, spannableToAdd.getLength());
+      spannableToAdd.setSpan(a, 0, spannableToAdd.length);
     });
 
     // |isUnique| specifies an annotation that cannot be duplicated.
@@ -1213,10 +1210,10 @@
           });
       var alreadyAnnotated = buff.some(function(s) {
         return annotationSansNodes.some(function(annotation) {
+          if (!s.hasSpan(annotation))
+            return false;
           var start = s.getSpanStart(annotation);
           var end = s.getSpanEnd(annotation);
-          if (start === undefined)
-            return false;
           return s.substring(start, end).toString() == value.toString();
         });
       });
@@ -1269,11 +1266,11 @@
 
   /**
    * Converts the currently rendered braille buffers to a single spannable.
-   * @return {!cvox.Spannable}
+   * @return {!Spannable}
    * @private
    */
   createBrailleOutput_: function() {
-    var result = new cvox.Spannable();
+    var result = new Spannable();
     var separator = '';  // Changes to space as appropriate.
     this.brailleBuffer_.forEach(function(cur) {
       // If this chunk is empty, don't add it since it won't result
@@ -1283,7 +1280,7 @@
       // case it will result in a cursor which has to be preserved.
       // In this case, having separators, potentially both before and after
       // the empty string is correct.
-      if (cur.getLength() == 0 && !cur.getSpanInstanceOf(Output.SelectionSpan))
+      if (cur.length == 0 && !cur.getSpanInstanceOf(Output.SelectionSpan))
         return;
       var spansToExtend = [];
       var spansToRemove = [];
@@ -1299,20 +1296,20 @@
       // using getSpansInstanceOf and check the endpoints (isntead of doing
       // the opposite).
       result.getSpansInstanceOf(Output.NodeSpan).forEach(function(leftSpan) {
-        if (result.getSpanEnd(leftSpan) < result.getLength())
+        if (result.getSpanEnd(leftSpan) < result.length)
           return;
-        var newEnd = result.getLength();
+        var newEnd = result.length;
         cur.getSpansInstanceOf(Output.NodeSpan).forEach(function(rightSpan) {
           if (cur.getSpanStart(rightSpan) == 0 &&
               leftSpan.node === rightSpan.node) {
             newEnd = Math.max(
                 newEnd,
-                result.getLength() + separator.length +
+                result.length + separator.length +
                     cur.getSpanEnd(rightSpan));
             spansToRemove.push(rightSpan);
           }
         });
-        if (newEnd > result.getLength())
+        if (newEnd > result.length)
           spansToExtend.push({span: leftSpan, end: newEnd});
       });
       result.append(separator);
@@ -1320,8 +1317,7 @@
       spansToExtend.forEach(function(elem) {
         result.setSpan(
             elem.span,
-            // Cast ok, since span is known to exist.
-            /** @type {number} */ (result.getSpanStart(elem.span)),
+            result.getSpanStart(elem.span),
             elem.end);
       });
       spansToRemove.forEach(result.removeSpan.bind(result));
diff --git a/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_integration_test.unitjs b/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_integration_test.unitjs
index 6a9b7a44..0870247 100644
--- a/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_integration_test.unitjs
+++ b/chrome/browser/resources/chromeos/chromevox/host/chrome/braille_integration_test.unitjs
@@ -174,11 +174,11 @@
   var selectionSpan = new cvox.ValueSelectionSpan();
   var valueSpan = new cvox.ValueSpan(20);
   var toSend = cvox.NavBraille.fromText(
-      new cvox.Spannable('Hello', valueSpan));
+      new Spannable('Hello', valueSpan));
   toSend.text.setSpan(selectionSpan, 0, 0);
-  toSend.text.setSpan(document.body, 0, toSend.text.getLength());
+  toSend.text.setSpan(document.body, 0, toSend.text.length);
   var expected = cvox.NavBraille.fromText(
-      new cvox.Spannable(toSend.text.toString(), valueSpan));
+      new Spannable(toSend.text.toString(), valueSpan));
   expected.text.setSpan(selectionSpan, 0, 0);
 
   this.braille.write(toSend);
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
index 30231ac7..9427b2c8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">ወደ ባለ6 ነጥብ ብሬይል ቀይር</translation>
 <translation id="1611168825862729585">የአምድ ራስጌ፦</translation>
+<translation id="1611649489706141841">ወደ ፊት</translation>
 <translation id="1613476421962910979">ኢርኮኖች በርተዋል</translation>
 <translation id="1618597272655350600">የተሟላ የአሁኑ ቦታ ሙሉ ማብራሪያ ያስታውቃል</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{ይበልጣል}one{# የይበልጣል ምልክቶች}other{# የይበልጣል ምልክቶች}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">የንግግር ድምጽ መጠን ይጨምሩ</translation>
 <translation id="5050015258024679800">ቀዳሚ የደረጃ 4 ርዕስ</translation>
 <translation id="5054047268577924192">ቀዳሚ የዝርዝር ንጥል</translation>
+<translation id="5075936896689244141">ቀጣይ የቁልፍ ካርታ</translation>
 <translation id="5078661581131202757">የፋይል ምርጫ</translation>
 <translation id="5080758118274074384">ሁለቴ ጠቅ ተደርጓል</translation>
+<translation id="5087864757604726239">ወደ ኋላ</translation>
 <translation id="5098541983634824365">ከፍርግርግ በመውጣት ላይ።</translation>
 <translation id="5102981729317424850">የመሣሪያ አሞሌ</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
index 655ce45c..9c47933 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">التبديل إلى نمط برايل 6 نقاط</translation>
 <translation id="1611168825862729585">رأس العمود:</translation>
+<translation id="1611649489706141841">للأمام</translation>
 <translation id="1613476421962910979">‏تم تشغيل Earcons</translation>
 <translation id="1618597272655350600">الإعلان عن وصف كامل للموضع الحالي</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{علامة أكبر من واحدة}zero{# greater than signs}two{علامتا أكبر من (#)}few{# علامات أكبر من}many{# علامة أكبر من}other{# من علامات أكبر من}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">زيادة مستوى صوت النطق</translation>
 <translation id="5050015258024679800">عنوان المستوى الرابع السابق</translation>
 <translation id="5054047268577924192">عنصر القائمة السابق</translation>
+<translation id="5075936896689244141">‏مخطط المفاتيح Next</translation>
 <translation id="5078661581131202757">تحديد الملف</translation>
 <translation id="5080758118274074384">تم النقر عليه نقرًا مزدوجًا</translation>
+<translation id="5087864757604726239">رجوع</translation>
 <translation id="5098541983634824365">مغادرة الشبكة.</translation>
 <translation id="5102981729317424850">شريط الأدوات</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
index 0adaf87..d0e4502 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">меню</translation>
 <translation id="1610130962244179598">Превключване към 6-точково брайлово писмо</translation>
 <translation id="1611168825862729585">Заглавка на графа:</translation>
+<translation id="1611649489706141841">напред</translation>
 <translation id="1613476421962910979">Звуковите сигнали са включени</translation>
 <translation id="1618597272655350600">Съобщава пълно описание на текущата позиция</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{знак за по-голямо}other{# знака за по-голямо}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Предишният списъчен елемент</translation>
 <translation id="5078661581131202757">Избиране на файлове</translation>
 <translation id="5080758118274074384">кликнахте два пъти</translation>
+<translation id="5087864757604726239">назад</translation>
 <translation id="5098541983634824365">Напускате таблицата.</translation>
 <translation id="5102981729317424850">Лента с инструменти</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
index c7b9221..d4d2c2b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">৬ ডট ব্রেইল-এ স্যুইচ করুন</translation>
 <translation id="1611168825862729585">কলাম শিরোলেখ:</translation>
+<translation id="1611649489706141841">ফরওয়ার্ড</translation>
 <translation id="1613476421962910979">Earcons চালু আছে</translation>
 <translation id="1618597272655350600">বর্তমান অবস্থানটির একটি সম্পূর্ণ বিবরণ ঘোষণা করে</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{বৃহত্তম}one{#টি বৃহত্তম চিহ্ন}other{#টি বৃহত্তম চিহ্ন}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">পূর্ববর্তী তালিকা আইটেম</translation>
 <translation id="5078661581131202757">ফাইল নির্বাচন</translation>
 <translation id="5080758118274074384">দুবার ক্লিক করা হয়েছে</translation>
+<translation id="5087864757604726239">ফিরুন</translation>
 <translation id="5098541983634824365">গ্রিড ত্যাগ করছে৷</translation>
 <translation id="5102981729317424850">সরঞ্জাম দণ্ড</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
index e4b8e95..4d83eb2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">menú</translation>
 <translation id="1610130962244179598">Canvia a braille de sis punts</translation>
 <translation id="1611168825862729585">Capçalera de la columna:</translation>
+<translation id="1611649489706141841">avança</translation>
 <translation id="1613476421962910979">Earcons activats</translation>
 <translation id="1618597272655350600">Anuncia una descripció completa de la posició actual.</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{major que}other{# símbols major que}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Element de la llista anterior</translation>
 <translation id="5078661581131202757">Selecció de fitxer</translation>
 <translation id="5080758118274074384">s'hi ha fet doble clic.</translation>
+<translation id="5087864757604726239">enrere</translation>
 <translation id="5098541983634824365">S'està sortint de la quadrícula.</translation>
 <translation id="5102981729317424850">Barra d'eines</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
index ba382ee..c849b88 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">nabíd</translation>
 <translation id="1610130962244179598">Přepnout na šestibodové Braillovo písmo</translation>
 <translation id="1611168825862729585">Záhlaví sloupce:</translation>
+<translation id="1611649489706141841">vpřed</translation>
 <translation id="1613476421962910979">Zvukové signály zapnuty</translation>
 <translation id="1618597272655350600">Oznamuje úplný popis současné pozice</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{je větší než}few{# znaky je větší než}many{# greater than signs}other{# znaků je větší než}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Předchozí položka v seznamu</translation>
 <translation id="5078661581131202757">Výběr souboru</translation>
 <translation id="5080758118274074384">dvakrát kliknuto</translation>
+<translation id="5087864757604726239">zpět</translation>
 <translation id="5098541983634824365">Opouští se mřížka.</translation>
 <translation id="5102981729317424850">Panel nástrojů</translation>
 <translation id="5105050547967751155">požad</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
index 4200046..d7a28de 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Skift til 6-punkts braillealfabet</translation>
 <translation id="1611168825862729585">Kolonneoverskrift:</translation>
+<translation id="1611649489706141841">videresend</translation>
 <translation id="1613476421962910979">Earcons til</translation>
 <translation id="1618597272655350600">Angiver en komplet beskrivelse af den aktuelle position</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{større end}one{# større end-tegn}other{# større end-tegn}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Forrige punkt på listen</translation>
 <translation id="5078661581131202757">Filvalg</translation>
 <translation id="5080758118274074384">dobbeltklikket på</translation>
+<translation id="5087864757604726239">tilbage</translation>
 <translation id="5098541983634824365">Forlader gitter.</translation>
 <translation id="5102981729317424850">Værktøjslinje</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
index cb6efcb..725652bf 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Zu 6-Punkt-Braille wechseln</translation>
 <translation id="1611168825862729585">Spaltenüberschrift:</translation>
+<translation id="1611649489706141841">Weiter</translation>
 <translation id="1613476421962910979">Earcons sind aktiviert.</translation>
 <translation id="1618597272655350600">Vollständige Beschreibung der aktuellen Position ansagen</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{Größer-als-Zeichen}other{# Größer-als-Zeichen}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Vorheriges Listenelement</translation>
 <translation id="5078661581131202757">Dateiauswahl</translation>
 <translation id="5080758118274074384">Doppelgeklickt</translation>
+<translation id="5087864757604726239">zurück</translation>
 <translation id="5098541983634824365">Raster wird verlassen.</translation>
 <translation id="5102981729317424850">Symbolleiste</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
index 7fecc67..8673f23 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">μενού</translation>
 <translation id="1610130962244179598">Αλλαγή σε εξάστιγμο μπράιγ</translation>
 <translation id="1611168825862729585">Κεφαλίδα στήλης:</translation>
+<translation id="1611649489706141841">προώθηση</translation>
 <translation id="1613476421962910979">Ηχητικά μηνύματα ενεργά</translation>
 <translation id="1618597272655350600">Παρέχει μια πλήρη περιγραφή της τρέχουσας τοποθεσίας</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{σύμβολο "μεγαλύτερο από"}other{# σύμβολα "μεγαλύτερο από"}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Αύξηση έντασης ομιλίας</translation>
 <translation id="5050015258024679800">Επικεφαλίδα προηγούμενου επιπέδου 4</translation>
 <translation id="5054047268577924192">Προηγούμενο στοιχείο λίστας</translation>
+<translation id="5075936896689244141">Επόμενη αντιστοίχιση πλήκτρων</translation>
 <translation id="5078661581131202757">Επιλογή αρχείου</translation>
 <translation id="5080758118274074384">έγινε διπλό κλικ</translation>
+<translation id="5087864757604726239">πίσω</translation>
 <translation id="5098541983634824365">Απομάκρυνση από το πλέγμα.</translation>
 <translation id="5102981729317424850">Γραμμή εργαλείων</translation>
 <translation id="5105050547967751155">απαιτείται</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
index 54a95c7..76cfd6e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Switch to 6 dot braille</translation>
 <translation id="1611168825862729585">Column header:</translation>
+<translation id="1611649489706141841">forward</translation>
 <translation id="1613476421962910979">Earcons on</translation>
 <translation id="1618597272655350600">Announces a complete description of the current position</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{greater than}other{# greater than signs}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Increase speech volume</translation>
 <translation id="5050015258024679800">Previous level 4 heading</translation>
 <translation id="5054047268577924192">Previous list item</translation>
+<translation id="5075936896689244141">Next keymap</translation>
 <translation id="5078661581131202757">File selection</translation>
 <translation id="5080758118274074384">double clicked</translation>
+<translation id="5087864757604726239">back</translation>
 <translation id="5098541983634824365">Leaving grid.</translation>
 <translation id="5102981729317424850">Tool bar</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
index a95a7169..4405217 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnú</translation>
 <translation id="1610130962244179598">Cambiar a braille de seis puntos</translation>
 <translation id="1611168825862729585">Encabezado de columna:</translation>
+<translation id="1611649489706141841">adelante</translation>
 <translation id="1613476421962910979">Sonido activado</translation>
 <translation id="1618597272655350600">Muestra una descripción completa de la posición actual.</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{mayor que}other{# signos mayor que}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Elemento anterior de la lista</translation>
 <translation id="5078661581131202757">Selección de archivos</translation>
 <translation id="5080758118274074384">Se hizo doble clic.</translation>
+<translation id="5087864757604726239">atrás</translation>
 <translation id="5098541983634824365">Saliendo de la cuadrícula</translation>
 <translation id="5102981729317424850">Barra de herramientas</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
index d351bfc3..d3fe2da5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Cambiar a Braille de seis puntos</translation>
 <translation id="1611168825862729585">Encabezado de columna:</translation>
+<translation id="1611649489706141841">adelante</translation>
 <translation id="1613476421962910979">Sonido activado</translation>
 <translation id="1618597272655350600">Muestra una descripción completa de la posición actual.</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{mayor que}other{# signos mayor que}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Elemento anterior de la lista</translation>
 <translation id="5078661581131202757">Selección de archivos</translation>
 <translation id="5080758118274074384">se ha hecho doble clic</translation>
+<translation id="5087864757604726239">atrás</translation>
 <translation id="5098541983634824365">Saliendo de la cuadrícula</translation>
 <translation id="5102981729317424850">Barra de herramientas</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
index 873e994a..79b22f6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnü</translation>
 <translation id="1610130962244179598">Lülitu 6-punktisele punktkirjale</translation>
 <translation id="1611168825862729585">Veeru päis:</translation>
+<translation id="1611649489706141841">edasi</translation>
 <translation id="1613476421962910979">Helisignaalid on sees</translation>
 <translation id="1618597272655350600">Esitab praeguse asukoha täpse kirjelduse</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{suurem kui}other{# märki „suurem kui”}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Eelmine loendiüksus</translation>
 <translation id="5078661581131202757">Faili valimine</translation>
 <translation id="5080758118274074384">topeltklõpsatud</translation>
+<translation id="5087864757604726239">Tagasi</translation>
 <translation id="5098541983634824365">Ruudustikust väljumine.</translation>
 <translation id="5102981729317424850">Tööriistariba</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
index d437354..79fad65 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">تغییر به بریل ۶ نقطه</translation>
 <translation id="1611168825862729585">عنوان ستون:</translation>
+<translation id="1611649489706141841">هدایت</translation>
 <translation id="1613476421962910979">نمادهای شنیداری روشن است</translation>
 <translation id="1618597272655350600">شرح کاملی از موقعیت کنونی را اعلام می‌کند</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{علامت بزرگ‌تر}one{# علامت بزرگ‌تر}other{# علامت بزرگ‌تر}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">مورد قبلی لیست</translation>
 <translation id="5078661581131202757">انتخاب فایل</translation>
 <translation id="5080758118274074384">دوبار کلیک شد</translation>
+<translation id="5087864757604726239">برگشت</translation>
 <translation id="5098541983634824365">خروج از حالت جدولی.</translation>
 <translation id="5102981729317424850">نوار ابزار</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
index e0e3a4a..64672c2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">val.</translation>
 <translation id="1610130962244179598">Vaihda 6 pisteen pistekirjoitukseen</translation>
 <translation id="1611168825862729585">Sarakkeen otsikko:</translation>
+<translation id="1611649489706141841">seuraava</translation>
 <translation id="1613476421962910979">Earcon-äänimerkit käytössä</translation>
 <translation id="1618597272655350600">Ilmoittaa nykyisen aseman täydellisen kuvauksen.</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{suuremmuus}other{# suuremmuusmerkkiä}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Edellinen luettelokohde</translation>
 <translation id="5078661581131202757">Tiedoston valinta</translation>
 <translation id="5080758118274074384">kaksoisklikattiin</translation>
+<translation id="5087864757604726239">takaisin</translation>
 <translation id="5098541983634824365">Poistutaan ruudukosta.</translation>
 <translation id="5102981729317424850">Työkalupalkki</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
index 61d3d20..baa0757d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Lumipat sa 6 dot braille</translation>
 <translation id="1611168825862729585">Header ng column:</translation>
+<translation id="1611649489706141841">susunod</translation>
 <translation id="1613476421962910979">Naka-on ang mga earcon</translation>
 <translation id="1618597272655350600">Nagpapahayag ng kumpletong paglalarawan sa kasalukuyang posisyon</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{greater than}one{# greater than sign}other{# na greater than sign}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Lakasan ang volume ng speech</translation>
 <translation id="5050015258024679800">Nakaraang heading sa antas 4</translation>
 <translation id="5054047268577924192">Nakaraang item sa listahan</translation>
+<translation id="5075936896689244141">Keymap ng Next</translation>
 <translation id="5078661581131202757">Pagpili ng file</translation>
 <translation id="5080758118274074384">na-double click</translation>
+<translation id="5087864757604726239">bumalik</translation>
 <translation id="5098541983634824365">Umaalis sa grid.</translation>
 <translation id="5102981729317424850">Tool bar</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
index d72062f9..80c196af9 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">menu</translation>
 <translation id="1610130962244179598">Passer au braille à six points</translation>
 <translation id="1611168825862729585">En-tête de colonne :</translation>
+<translation id="1611649489706141841">suivant</translation>
 <translation id="1613476421962910979">Icônes audio activées</translation>
 <translation id="1618597272655350600">Énonce la description complète de la position actuelle.</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{signe supérieur à}one{# signe supérieur à}other{# signes supérieur à}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Élément de liste précédent</translation>
 <translation id="5078661581131202757">Sélection de fichier</translation>
 <translation id="5080758118274074384">Élément sur lequel vous avez double-cliqué</translation>
+<translation id="5087864757604726239">retour</translation>
 <translation id="5098541983634824365">Fermeture de la grille</translation>
 <translation id="5102981729317424850">Barre d'outils</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
index b6a1fee..6ec94222 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 ડોટ બ્રેઇલ પર સ્વિચ કરો</translation>
 <translation id="1611168825862729585">કૉલમ હેડર:</translation>
+<translation id="1611649489706141841">ફોરવર્ડ કરો</translation>
 <translation id="1613476421962910979">ઇઅરકોન્સ ચાલુ છે</translation>
 <translation id="1618597272655350600">વર્તમાન સ્થિતિનું સંપૂર્ણ વર્ણન જાહેર કરે છે</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{આના કરતાં મોટું}one{# આના કરતાં મોટાની નિશાની}other{# આના કરતાં મોટાની નિશાની}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">પહેલાની સૂચિ આઇટમ</translation>
 <translation id="5078661581131202757">ફાઇલ પસંદગી</translation>
 <translation id="5080758118274074384">ડબલ ક્લિક કર્યું</translation>
+<translation id="5087864757604726239">પાછા ફરો</translation>
 <translation id="5098541983634824365">ગ્રીડ છોડવી.</translation>
 <translation id="5102981729317424850">ટુલ બાર</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
index 2ca05b0..1abc66c7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 बिंदु ब्रेल पर स्विच करें</translation>
 <translation id="1611168825862729585">स्तंभ शीर्षलेख:</translation>
+<translation id="1611649489706141841">अग्रेषित करें</translation>
 <translation id="1613476421962910979">ईयरकॉन चालू हैं</translation>
 <translation id="1618597272655350600">वर्तमान स्थिति का संपूर्ण विवरण दर्शाता है</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{इससे बड़ा}one{# इससे बड़ा चिह्न}other{# इससे बड़ा चिह्न}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">पिछला सूची आइटम</translation>
 <translation id="5078661581131202757">फ़ाइल चयन</translation>
 <translation id="5080758118274074384">डबल क्लिक किया गया</translation>
+<translation id="5087864757604726239">वापस जाएं</translation>
 <translation id="5098541983634824365">ग्रिड छोड़ रहे हैं.</translation>
 <translation id="5102981729317424850">टूल बार</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
index 4289170f7..b328ed5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">izb</translation>
 <translation id="1610130962244179598">Prijeđi na 6-točkastu brajicu</translation>
 <translation id="1611168825862729585">Zaglavlje stupca:</translation>
+<translation id="1611649489706141841">prosljeđivanje</translation>
 <translation id="1613476421962910979">Zvučne su ikone uključene</translation>
 <translation id="1618597272655350600">Najavljuje potpun opis trenutačnog položaja</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{znak "veće od"}one{# znak "veće od"}few{# znaka "veće od"}other{# znakova "veće od"}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Prethodna stavka popisa</translation>
 <translation id="5078661581131202757">Odabir datoteke</translation>
 <translation id="5080758118274074384">dvaput kliknuto</translation>
+<translation id="5087864757604726239">natrag</translation>
 <translation id="5098541983634824365">Napuštanje rešetke.</translation>
 <translation id="5102981729317424850">Alatna traka</translation>
 <translation id="5105050547967751155">obvz</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
index ad492b0..a03507a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnü</translation>
 <translation id="1610130962244179598">Váltás 6 pontos braille-táblázatra</translation>
 <translation id="1611168825862729585">Oszlopfejléc:</translation>
+<translation id="1611649489706141841">következő</translation>
 <translation id="1613476421962910979">beállítási oldal</translation>
 <translation id="1618597272655350600">Pontosan elmondja, hogy mi az aktuális pozíció</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{nagyobb jel}other{# nagyobb jel}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Előző listaelem</translation>
 <translation id="5078661581131202757">Fájl kiválasztása</translation>
 <translation id="5080758118274074384">duplán kattintva</translation>
+<translation id="5087864757604726239">vissza</translation>
 <translation id="5098541983634824365">Rács elhagyása.</translation>
 <translation id="5102981729317424850">Eszköztár</translation>
 <translation id="5105050547967751155">kötelező</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
index f80a64f..50ee66a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Beralih ke braille 6 titik</translation>
 <translation id="1611168825862729585">Judul kolom:</translation>
+<translation id="1611649489706141841">maju</translation>
 <translation id="1613476421962910979">Earcons aktif</translation>
 <translation id="1618597272655350600">Mengumumkan deskripsi lengkap dari posisi saat ini</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{lebih dari}other{# tanda lebih dari}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Meningkatkan volume ucapan</translation>
 <translation id="5050015258024679800">Judul tingkat 4 sebelumnya</translation>
 <translation id="5054047268577924192">Item daftar sebelumnya</translation>
+<translation id="5075936896689244141">Peta tombol berikutnya</translation>
 <translation id="5078661581131202757">Pilihan file</translation>
 <translation id="5080758118274074384">diklik dua kali</translation>
+<translation id="5087864757604726239">kembali</translation>
 <translation id="5098541983634824365">Meninggalkan kisi.</translation>
 <translation id="5102981729317424850">Bilah alat</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
index af7fc42..f8ed5879 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Passa a braille a sei punti</translation>
 <translation id="1611168825862729585">Intestazione di colonna:</translation>
+<translation id="1611649489706141841">avanti</translation>
 <translation id="1613476421962910979">Icone audio attivate</translation>
 <translation id="1618597272655350600">Fornisce una descrizione completa della posizione corrente</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{simbolo di maggiore}other{# simboli di maggiore}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Voce elenco precedente</translation>
 <translation id="5078661581131202757">Selezione file</translation>
 <translation id="5080758118274074384">Selezionato con doppio clic</translation>
+<translation id="5087864757604726239">indietro</translation>
 <translation id="5098541983634824365">Stai uscendo dalla griglia.</translation>
 <translation id="5102981729317424850">Barra degli strumenti</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
index 6efad75..65a92f4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">עבור לברייל 6 נקודות</translation>
 <translation id="1611168825862729585">כותרת עמודה:</translation>
+<translation id="1611649489706141841">קדימה</translation>
 <translation id="1613476421962910979">‏Earcons מופעלים</translation>
 <translation id="1618597272655350600">הכרזה על תיאור מלא של המיקום הנוכחי</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{סימן ‘גדול מ’}two{# סימני ’גדול מ’}many{# סימני ’גדול מ’}other{# סימני ’גדול מ’}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">הגבר את עוצמת הדיבור</translation>
 <translation id="5050015258024679800">הכותרת הקודמת של רמה 4</translation>
 <translation id="5054047268577924192">פריט קודם ברשימה</translation>
+<translation id="5075936896689244141">‏מפת המקשים Next</translation>
 <translation id="5078661581131202757">בחירת קובץ</translation>
 <translation id="5080758118274074384">בוצעה לחיצה כפולה</translation>
+<translation id="5087864757604726239">הקודם</translation>
 <translation id="5098541983634824365">יציאה מהרשת.</translation>
 <translation id="5102981729317424850">סרגל כלים</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
index 4573ee5d..7c745ba2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">メニュー</translation>
 <translation id="1610130962244179598">6 点点字に切り替え</translation>
 <translation id="1611168825862729585">列見出し:</translation>
+<translation id="1611649489706141841">進む</translation>
 <translation id="1613476421962910979">イアコン オン</translation>
 <translation id="1618597272655350600">現在位置の詳細な説明を読み上げます</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{大なり}other{# 個の大なり記号}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">前のリスト項目</translation>
 <translation id="5078661581131202757">ファイル選択</translation>
 <translation id="5080758118274074384">ダブルクリックしました</translation>
+<translation id="5087864757604726239">戻る</translation>
 <translation id="5098541983634824365">グリッドから離れます。</translation>
 <translation id="5102981729317424850">ツールバー</translation>
 <translation id="5105050547967751155">必須</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
index 1ba8064..7fb1f2c7e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 ಡಾಟ್‌ ಬ್ರೈಲಿಗೆ ಬದಲಿಸಿ</translation>
 <translation id="1611168825862729585">ಕಾಲಮ್ ಶಿರೋನಾಮೆ:</translation>
+<translation id="1611649489706141841">ಮುಂದೆ</translation>
 <translation id="1613476421962910979">Earcons ಆನ್ ಆಗಿದೆ</translation>
 <translation id="1618597272655350600">ಪ್ರಸ್ತುತ ಸ್ಥಾನದ ಸಂಪೂರ್ಣ ವಿವರಣೆಯನ್ನು ಪ್ರಕಟಿಸುತ್ತದೆ</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{ಹೆಚ್ಚು ಸೂಚಕ}one{# ಹೆಚ್ಚು ಸೂಚಕ ಚಿಹ್ನೆಗಳು}other{# ಹೆಚ್ಚು ಸೂಚಕ ಚಿಹ್ನೆಗಳು}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">ಹಿಂದಿನ ಪಟ್ಟಿಯ ಐಟಂ</translation>
 <translation id="5078661581131202757">ಫೈಲ್ ಆಯ್ಕೆ</translation>
 <translation id="5080758118274074384">ಡಬಲ್ ಕ್ಲಿಕ್ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="5087864757604726239">ಹಿಂದೆ</translation>
 <translation id="5098541983634824365">ಗ್ರಿಡ್ ತೊರೆಯಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="5102981729317424850">ಪರಿಕರ ಪಟ್ಟಿ</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
index 0cea92c..c5f30648 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6점 점자로 전환</translation>
 <translation id="1611168825862729585">열 헤더:</translation>
+<translation id="1611649489706141841">앞으로</translation>
 <translation id="1613476421962910979">이어콘 사용</translation>
 <translation id="1618597272655350600">현재 위치에 대한 자세한 설명을 들려줍니다.</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{큼 부호}other{큼 부호 #개}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">이전 목록 항목</translation>
 <translation id="5078661581131202757">파일 선택</translation>
 <translation id="5080758118274074384">더블 클릭함</translation>
+<translation id="5087864757604726239">뒤로</translation>
 <translation id="5098541983634824365">격자를 종료합니다.</translation>
 <translation id="5102981729317424850">툴바</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
index 219f2cb..695afd41 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Perjungti į 6 taškų Brailio rašmenis</translation>
 <translation id="1611168825862729585">Stulpelio antraštė:</translation>
+<translation id="1611649489706141841">persiųsti</translation>
 <translation id="1613476421962910979">Garsiniai ženkleliai įjungti</translation>
 <translation id="1618597272655350600">Paskelbiamas išsamus esamos pozicijos aprašas</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{ženklas daugiau}one{# ženklas daugiau}few{# ženklai daugiau}many{# greater than signs}other{# ženklų daugiau}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Ankstesnis sąrašo elementas</translation>
 <translation id="5078661581131202757">Failo pasirinkimas</translation>
 <translation id="5080758118274074384">dukart spustelėta</translation>
+<translation id="5087864757604726239">atgal</translation>
 <translation id="5098541983634824365">Išeinama iš tinklelio.</translation>
 <translation id="5102981729317424850">Įrankių juosta</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
index 890118e8..5cd45d7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">izvēlne</translation>
 <translation id="1610130962244179598">Pāriet uz 6 punktu Braila rakstu</translation>
 <translation id="1611168825862729585">Slejas virsraksts:</translation>
+<translation id="1611649489706141841">pārsūtīt</translation>
 <translation id="1613476421962910979">Signāli ieslēgti</translation>
 <translation id="1618597272655350600">Sniedz pilnīgu aprakstu par pašreizējo pozīciju</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{zīme “lielāks par”}zero{# zīmju “lielāks par”}one{# zīme “lielāks par”}other{# zīmes “lielāks par”}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Iepriekšējais saraksta vienums</translation>
 <translation id="5078661581131202757">Failu atlase</translation>
 <translation id="5080758118274074384">Tika veikts dubultklikšķis.</translation>
+<translation id="5087864757604726239">atpakaļ</translation>
 <translation id="5098541983634824365">Notiek iziešana no režģa.</translation>
 <translation id="5102981729317424850">Rīkjosla</translation>
 <translation id="5105050547967751155">nepieciešams</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
index eca9d67..7d46af0 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 ഡോട്ട് ബ്രെയ്‌ലിയിലേക്ക് മാറുക</translation>
 <translation id="1611168825862729585">നിര ശീർഷകം:</translation>
+<translation id="1611649489706141841">കൈമാറുക</translation>
 <translation id="1613476421962910979">ഇയർകോൺസ് ഓണാണ്</translation>
 <translation id="1618597272655350600">നിലവിലെ അവസ്ഥയെക്കുറിച്ച് ഒരു പൂർണ്ണമായ വിവരണം പ്രഖ്യാപിക്കുന്നു</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{അവരോഹണ ചിഹ്നം}other{# അവരോഹണ ചിഹ്നങ്ങൾ}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">മുൻ ലിസ്റ്റ് ഇനം</translation>
 <translation id="5078661581131202757">ഫയൽ തിരഞ്ഞെടുക്കൽ</translation>
 <translation id="5080758118274074384">ഇരട്ട ക്ലിക്കുചെയ്‌തു</translation>
+<translation id="5087864757604726239">തിരികെ</translation>
 <translation id="5098541983634824365">ഗ്രിഡ് ഉപേക്ഷിക്കുന്നു.</translation>
 <translation id="5102981729317424850">ഉപകരണ ബാർ</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
index e8a396fe..019b8b8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 बिंदू ब्रेलवर स्विच करा</translation>
 <translation id="1611168825862729585">स्‍तंभ शीर्षलेख:</translation>
+<translation id="1611649489706141841">अग्रेषित करा</translation>
 <translation id="1613476421962910979">इअरकॉन चालू आहेत</translation>
 <translation id="1618597272655350600">वर्तमान स्‍थितीबद्दल पूर्ण वर्णन घोषित करते</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{पेक्षा मोठे}one{# पेक्षा मोठे चिन्हे}other{# पेक्षा मोठे चिन्हे}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">मागील सूची आयटम</translation>
 <translation id="5078661581131202757">फाइल निवड</translation>
 <translation id="5080758118274074384">दोनदा क्लिक केला</translation>
+<translation id="5087864757604726239">परत</translation>
 <translation id="5098541983634824365">ग्रिड सोडत आहे.</translation>
 <translation id="5102981729317424850">टूलबार</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
index a11eb93..f61a198 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Tukar kepada braille 6 titik</translation>
 <translation id="1611168825862729585">Pengepala lajur:</translation>
+<translation id="1611649489706141841">ke hadapan</translation>
 <translation id="1613476421962910979">Earcon hidup</translation>
 <translation id="1618597272655350600">Mengumumkan huraian lengkap tentang kedudukan semasa</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{lebih besar daripada}other{# tanda lebih besar daripada}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Tingkatkan kelantangan pertuturan</translation>
 <translation id="5050015258024679800">Tajuk tahap 4 sebelumnya</translation>
 <translation id="5054047268577924192">Item senarai sebelumnya</translation>
+<translation id="5075936896689244141">Peta kekunci Next</translation>
 <translation id="5078661581131202757">Pemilihan fail</translation>
 <translation id="5080758118274074384">diklik dua kali</translation>
+<translation id="5087864757604726239">kembali</translation>
 <translation id="5098541983634824365">Meninggalkan grid.</translation>
 <translation id="5102981729317424850">Bar alat</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
index 70e8307..d4ba210 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">menu</translation>
 <translation id="1610130962244179598">Overschakelen naar zespuntsbraille</translation>
 <translation id="1611168825862729585">Koptekst kolom:</translation>
+<translation id="1611649489706141841">vooruit</translation>
 <translation id="1613476421962910979">Earcons aan</translation>
 <translation id="1618597272655350600">Geeft een volledige beschrijving van de huidige positie</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{groter-dan-teken}other{# groter-dan-tekens}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Vorig item in de lijst</translation>
 <translation id="5078661581131202757">Bestand selecteren</translation>
 <translation id="5080758118274074384">Gedubbelklikt</translation>
+<translation id="5087864757604726239">terug</translation>
 <translation id="5098541983634824365">Raster verlaten.</translation>
 <translation id="5102981729317424850">Werkbalk</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
index 24d1d09..a60cf6d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Bytt til 6-punkts punktskrift</translation>
 <translation id="1611168825862729585">Kolonneoverskrift:</translation>
+<translation id="1611649489706141841">fremover</translation>
 <translation id="1613476421962910979">Lydsignaler er på</translation>
 <translation id="1618597272655350600">Kunngjør en fullstendig beskrivelse av den gjeldende posisjonen</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{større enn}other{# større enn-tegn}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Forrige listeelement</translation>
 <translation id="5078661581131202757">Filvalg</translation>
 <translation id="5080758118274074384">ble dobbeltklikket på</translation>
+<translation id="5087864757604726239">tilbake</translation>
 <translation id="5098541983634824365">Forlater rutenettet.</translation>
 <translation id="5102981729317424850">Verktøyrad</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
index a789293..7d175aa 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Przełącz na pismo 6-punktowe Braille'a</translation>
 <translation id="1611168825862729585">Nagłówek kolumny:</translation>
+<translation id="1611649489706141841">do przodu</translation>
 <translation id="1613476421962910979">Ikony akustyczne są włączone</translation>
 <translation id="1618597272655350600">Przedstawia pełny opis aktualnej pozycji</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{większy niż}few{# znaki większości}many{# znaków większości}other{# greater than signs}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Poprzedni element listy</translation>
 <translation id="5078661581131202757">Wybór pliku</translation>
 <translation id="5080758118274074384">kliknięte dwukrotnie</translation>
+<translation id="5087864757604726239">wstecz</translation>
 <translation id="5098541983634824365">Opuszczasz siatkę.</translation>
 <translation id="5102981729317424850">Pasek narzędzi</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
index 2bd4672..5e0902c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Alternar para braille de seis pontos</translation>
 <translation id="1611168825862729585">Cabeçalho da coluna:</translation>
+<translation id="1611649489706141841">avançar</translation>
 <translation id="1613476421962910979">Earcons ativados</translation>
 <translation id="1618597272655350600">Anuncia uma descrição completa da posição atual</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{sinal maior que}one{# sinais de maior que}other{# sinais de maior que}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Item anterior da lista</translation>
 <translation id="5078661581131202757">Seleção de arquivo</translation>
 <translation id="5080758118274074384">clicado duas vezes</translation>
+<translation id="5087864757604726239">voltar</translation>
 <translation id="5098541983634824365">Saindo da grade.</translation>
 <translation id="5102981729317424850">Barra de ferramentas</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
index ded2d05c..1a328a5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Mudar para braille de 6 pontos</translation>
 <translation id="1611168825862729585">Cabeçalho da coluna:</translation>
+<translation id="1611649489706141841">avançar</translation>
 <translation id="1613476421962910979">Ícones sonoros ativados</translation>
 <translation id="1618597272655350600">Anuncia uma descrição completa da posição atual</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{maior que}other{# sinais de maior que}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Item de lista anterior</translation>
 <translation id="5078661581131202757">Seleção de ficheiro</translation>
 <translation id="5080758118274074384">clicado duas vezes</translation>
+<translation id="5087864757604726239">anterior</translation>
 <translation id="5098541983634824365">A sair da grelha.</translation>
 <translation id="5102981729317424850">Barra de ferramentas</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
index 90f4458..b250990 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">meniu</translation>
 <translation id="1610130962244179598">Comutați la tabelul Braille cu 6 puncte</translation>
 <translation id="1611168825862729585">Antet de coloană:</translation>
+<translation id="1611649489706141841">înainte</translation>
 <translation id="1613476421962910979">Semnalele audio sunt activate</translation>
 <translation id="1618597272655350600">Anunță o descriere completă a poziției curente</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{semn mai mare}few{# semne mai mare}other{# de semne mai mare}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Elementul anterior din listă</translation>
 <translation id="5078661581131202757">Selectare fișier</translation>
 <translation id="5080758118274074384">ați dat dublu clic</translation>
+<translation id="5087864757604726239">înapoi</translation>
 <translation id="5098541983634824365">Se iese din grilă.</translation>
 <translation id="5102981729317424850">Bară de instrumente</translation>
 <translation id="5105050547967751155">obligatoriu</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
index eb4305a6..a560898 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Переключиться на 6-точечный шрифт</translation>
 <translation id="1611168825862729585">Заголовок столбца:</translation>
+<translation id="1611649489706141841">вперед</translation>
 <translation id="1613476421962910979">Звуковые сигналы включены.</translation>
 <translation id="1618597272655350600">Озвучить полное описание текущего элемента</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{знак "больше"}one{# знак "больше"}few{# знака "больше"}many{# знаков "больше"}other{# greater than signs}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Перейти к предыдущему пункту списка</translation>
 <translation id="5078661581131202757">Выбор файла</translation>
 <translation id="5080758118274074384">Выполнено двойное нажатие.</translation>
+<translation id="5087864757604726239">назад</translation>
 <translation id="5098541983634824365">Выход из сетки.</translation>
 <translation id="5102981729317424850">Панель инструментов</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
index a0a625d..5903d443 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">ponuka</translation>
 <translation id="1610130962244179598">Prepnúť na šesťbodové Braillovo písmo</translation>
 <translation id="1611168825862729585">Hlavička stĺpca:</translation>
+<translation id="1611649489706141841">dopredu</translation>
 <translation id="1613476421962910979">Zvukové signály sú zapnuté</translation>
 <translation id="1618597272655350600">Oznamuje úplný popis aktuálnej pozície</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{znak je väčšie ako}few{# znaky je väčšie ako}many{# greater than signs}other{# znakov je väčšie ako}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Zvýšiť hlasitosť reči</translation>
 <translation id="5050015258024679800">Predchádzajúci nadpis 4. úrovne</translation>
 <translation id="5054047268577924192">Predchádzajúca položka v zozname</translation>
+<translation id="5075936896689244141">Ďalšia mapa klávesov</translation>
 <translation id="5078661581131202757">Výber súboru</translation>
 <translation id="5080758118274074384">dvakrát kliknuté</translation>
+<translation id="5087864757604726239">späť</translation>
 <translation id="5098541983634824365">Opúšťate mriežku</translation>
 <translation id="5102981729317424850">Panel s nástrojmi</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
index f4f7ff8..765712a9 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">men</translation>
 <translation id="1610130962244179598">Preklop na braillovo pisavo s 6 pikami</translation>
 <translation id="1611168825862729585">Glava stolpca:</translation>
+<translation id="1611649489706141841">naprej</translation>
 <translation id="1613476421962910979">Zvočne ikone vklopljene</translation>
 <translation id="1618597272655350600">Objavi popoln opis trenutnega položaja</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{znak za več}one{# znak za več}two{# znaka za več}few{# znaki za več}other{# znakov za več}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Prejšnji element seznama</translation>
 <translation id="5078661581131202757">Izbor datoteke</translation>
 <translation id="5080758118274074384">dvokliknjeno</translation>
+<translation id="5087864757604726239">nazaj</translation>
 <translation id="5098541983634824365">Izhod iz mreže.</translation>
 <translation id="5102981729317424850">Orodna vrstica</translation>
 <translation id="5105050547967751155">zh</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
index 0c7fba167..74d3937 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Пребаци на Брајеву азбуку са 6 тачака</translation>
 <translation id="1611168825862729585">Заглавље колоне:</translation>
+<translation id="1611649489706141841">кретање напред</translation>
 <translation id="1613476421962910979">Звучна обавештења су укључена</translation>
 <translation id="1618597272655350600">Објављује потпун опис актуелног положаја</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{знак „веће од“}one{# знак „веће од“}few{# знака „веће од“}other{# знакова „веће од“}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Претходна ставка листе</translation>
 <translation id="5078661581131202757">Избор датотека</translation>
 <translation id="5080758118274074384">кликнуто двапут</translation>
+<translation id="5087864757604726239">назад</translation>
 <translation id="5098541983634824365">Напуштање мреже.</translation>
 <translation id="5102981729317424850">Трака с алаткама</translation>
 <translation id="5105050547967751155">обавезно</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
index f955a93..13c0e6f6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">meny</translation>
 <translation id="1610130962244179598">Byt till punktskrift med sex punkter</translation>
 <translation id="1611168825862729585">Kolumnrubrik:</translation>
+<translation id="1611649489706141841">framåt</translation>
 <translation id="1613476421962910979">Ljudikoner har aktiverats</translation>
 <translation id="1618597272655350600">Ger en komplett beskrivning av den aktuella positionen</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{större än-tecken}other{# större än-tecken}}</translation>
@@ -391,8 +392,10 @@
 <translation id="5042770794184672516">Höj talvolymen</translation>
 <translation id="5050015258024679800">Föregående rubrik på nivå 4</translation>
 <translation id="5054047268577924192">Föregående post i listan</translation>
+<translation id="5075936896689244141">Nästa tangentuppsättning</translation>
 <translation id="5078661581131202757">Filval</translation>
 <translation id="5080758118274074384">dubbelklickat</translation>
+<translation id="5087864757604726239">tillbaka</translation>
 <translation id="5098541983634824365">Lämnar rutnätet.</translation>
 <translation id="5102981729317424850">Verktygsfält</translation>
 <translation id="5105050547967751155">obligatoriskt</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
index a75b935..aa1af73 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">menyu</translation>
 <translation id="1610130962244179598">Badilisha hadi Breli ya vitone 6</translation>
 <translation id="1611168825862729585">Kichwa cha safu wima:</translation>
+<translation id="1611649489706141841">sambaza</translation>
 <translation id="1613476421962910979">Earcons zimewashwa</translation>
 <translation id="1618597272655350600">Hutangaza maelezo kamili ya nafasi ya sasa</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{kubwa kuliko}other{alama # za kubwa kuliko}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Kipengee cha orodha kilichotangulia</translation>
 <translation id="5078661581131202757">Uchaguzi wa faili</translation>
 <translation id="5080758118274074384">kimebofiwa mara mbili</translation>
+<translation id="5087864757604726239">nyuma</translation>
 <translation id="5098541983634824365">Unaondoka kwenye gridi.</translation>
 <translation id="5102981729317424850">Upau zana</translation>
 <translation id="5105050547967751155">inahitajika</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
index 18d658a..d626829 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 புள்ளி பிரெய்லுக்கு மாறு</translation>
 <translation id="1611168825862729585">நெடுவரிசை மேற்தலைப்பு:</translation>
+<translation id="1611649489706141841">&amp;அடுத்தப் பக்கம்</translation>
 <translation id="1613476421962910979">ஆடியோ செய்திகளை இயக்கு</translation>
 <translation id="1618597272655350600">தற்போதைய நிலையின் முழு விளக்கத்தை அறிவிக்கிறது</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{அதிகத்திற்கான குறி}other{# அதிகத்திற்கான குறிகள்}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">முந்தைய பட்டியல் உருப்படி</translation>
 <translation id="5078661581131202757">கோப்பு தேர்வு</translation>
 <translation id="5080758118274074384">இரு கிளிக் செய்யப்பட்டது</translation>
+<translation id="5087864757604726239">முந்தைய</translation>
 <translation id="5098541983634824365">கட்டத்தை விட்டு விலகுகிறீர்கள்.</translation>
 <translation id="5102981729317424850">கருவிப் பட்டி</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
index 509e59c..18c0c2d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 చుక్కల బ్రెయిలీకి మార్చు</translation>
 <translation id="1611168825862729585">నిలువు వరుస శీర్షిక:</translation>
+<translation id="1611649489706141841">ముందుకు</translation>
 <translation id="1613476421962910979">శబ్ద హెచ్చరికలు ప్రారంభించబడ్డాయి</translation>
 <translation id="1618597272655350600">ప్రస్తుత స్థానం యొక్క పూర్తి వివరణను తెలియజేస్తుంది</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{గురుతర గుర్తు}other{# గురుతర గుర్తులు}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">మునుపటి జాబితా అంశం</translation>
 <translation id="5078661581131202757">పైల్ ఎంపిక</translation>
 <translation id="5080758118274074384">రెండుసార్లు క్లిక్ చేయబడింది</translation>
+<translation id="5087864757604726239">వెనుకకు</translation>
 <translation id="5098541983634824365">గ్రిడ్ నుండి నిష్క్రమిస్తున్నారు.</translation>
 <translation id="5102981729317424850">సాధనపట్టీ</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
index 20b74cb..d4d3c99 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">เมนู</translation>
 <translation id="1610130962244179598">เปลี่ยนเป็นเบรลล์แบบ 6 จุด</translation>
 <translation id="1611168825862729585">ส่วนหัวคอลัมน์:</translation>
+<translation id="1611649489706141841">ไปข้างหน้า</translation>
 <translation id="1613476421962910979">Earcons เปิด</translation>
 <translation id="1618597272655350600">แจ้งคำอธิบายแบบเต็มของตำแหน่งปัจจุบัน</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{เครื่องหมายมากกว่า}other{# เครื่องหมายมากกว่า}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">รายการก่อนหน้า</translation>
 <translation id="5078661581131202757">การเลือกไฟล์</translation>
 <translation id="5080758118274074384">ดับเบิลคลิกแล้ว</translation>
+<translation id="5087864757604726239">กลับ</translation>
 <translation id="5098541983634824365">ออกจากตาราง</translation>
 <translation id="5102981729317424850">แถบเครื่องมือ</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
index ba87e0a..7693c51 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">6 noktalı braille'e geç</translation>
 <translation id="1611168825862729585">Sütun üst bilgisi:</translation>
+<translation id="1611649489706141841">ileri</translation>
 <translation id="1613476421962910979">Ses sinyalleri açık</translation>
 <translation id="1618597272655350600">Mevcut konumun tam açıklamasını söyler</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{büyüktür işareti}other{# büyüktür işareti}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Önceki liste öğesi</translation>
 <translation id="5078661581131202757">Dosya seçimi</translation>
 <translation id="5080758118274074384">çift tıklandı</translation>
+<translation id="5087864757604726239">geri</translation>
 <translation id="5098541983634824365">Tablodan çıkılıyor.</translation>
 <translation id="5102981729317424850">Araç çubuğu</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
index 7563938..97a7493 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">меню</translation>
 <translation id="1610130962244179598">Перейти до 6-крапкового шрифту Брайля</translation>
 <translation id="1611168825862729585">Заголовок стовпця:</translation>
+<translation id="1611649489706141841">уперед</translation>
 <translation id="1613476421962910979">Звуковий ефект увімкнено</translation>
 <translation id="1618597272655350600">Повідомляє повний опис поточної позиції</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{знак "більше"}one{# знак "більше"}few{# знаки "більше"}many{# знаків "більше"}other{# greater than signs}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Попередній пункт списку</translation>
 <translation id="5078661581131202757">Вибір файлу</translation>
 <translation id="5080758118274074384">двічі натиснуто</translation>
+<translation id="5087864757604726239">назад</translation>
 <translation id="5098541983634824365">Вихід із сітки.</translation>
 <translation id="5102981729317424850">Панель інструментів</translation>
 <translation id="5105050547967751155">обов’язково</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
index 2807820..4d24dfa 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">mnu</translation>
 <translation id="1610130962244179598">Chuyển sang chữ nổi 6 chấm</translation>
 <translation id="1611168825862729585">Tiêu đề cột:</translation>
+<translation id="1611649489706141841">chuyển tiếp</translation>
 <translation id="1613476421962910979">Bật kết nối tai nghe</translation>
 <translation id="1618597272655350600">Thông báo mô tả đầy đủ của vị trí hiện tại</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{dấu lớn hơn}other{# dấu lớn hơn}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">Mục danh sách trước</translation>
 <translation id="5078661581131202757">Chọn tệp</translation>
 <translation id="5080758118274074384">được nhấp đúp</translation>
+<translation id="5087864757604726239">quay lại</translation>
 <translation id="5098541983634824365">Thoát khỏi lưới.</translation>
 <translation id="5102981729317424850">Thanh công cụ</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
index 061a342..5e8942aa 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">菜单</translation>
 <translation id="1610130962244179598">切换到6点式盲文</translation>
 <translation id="1611168825862729585">列标题:</translation>
+<translation id="1611649489706141841">前进</translation>
 <translation id="1613476421962910979">已开启耳标</translation>
 <translation id="1618597272655350600">读出关于当前位置的完整说明</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{1个大于号}other{#个大于号}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">上一个列表项</translation>
 <translation id="5078661581131202757">文件选择</translation>
 <translation id="5080758118274074384">已双击</translation>
+<translation id="5087864757604726239">后退</translation>
 <translation id="5098541983634824365">即将离开网格。</translation>
 <translation id="5102981729317424850">工具栏</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
index 23ec814..5468f87b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -52,6 +52,7 @@
 <translation id="1594072653727561613">選單</translation>
 <translation id="1610130962244179598">切換至 6 點點字</translation>
 <translation id="1611168825862729585">欄標題:</translation>
+<translation id="1611649489706141841">下一頁</translation>
 <translation id="1613476421962910979">聽覺標示已開啟</translation>
 <translation id="1618597272655350600">朗讀目前位置的完整說明</translation>
 <translation id="1639634871799530612">{COUNT,plural, =1{大於符號}other{# 個大於符號}}</translation>
@@ -393,6 +394,7 @@
 <translation id="5054047268577924192">上一個清單項目</translation>
 <translation id="5078661581131202757">選取檔案</translation>
 <translation id="5080758118274074384">按了兩下</translation>
+<translation id="5087864757604726239">返回</translation>
 <translation id="5098541983634824365">離開網格。</translation>
 <translation id="5102981729317424850">工具列</translation>
 <translation id="5105050547967751155">rq</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/walkers/abstract_selection_walker.js b/chrome/browser/resources/chromeos/chromevox/walkers/abstract_selection_walker.js
index e56b5d7a6a..00ea3cc 100644
--- a/chrome/browser/resources/chromeos/chromevox/walkers/abstract_selection_walker.js
+++ b/chrome/browser/resources/chromeos/chromevox/walkers/abstract_selection_walker.js
@@ -13,11 +13,11 @@
 
 goog.provide('cvox.AbstractSelectionWalker');
 
+goog.require('Spannable');
 goog.require('cvox.AbstractWalker');
 goog.require('cvox.BareObjectWalker');
 goog.require('cvox.DescriptionUtil');
 goog.require('cvox.DomUtil');
-goog.require('cvox.Spannable');
 goog.require('cvox.TraverseContent');
 
 /**
@@ -149,7 +149,7 @@
 cvox.AbstractSelectionWalker.prototype.getBraille = function(prevSel, sel) {
   var node = sel.absStart().node;
   var text = cvox.TraverseUtil.getNodeText(node);
-  var spannable = new cvox.Spannable(text);
+  var spannable = new Spannable(text);
   spannable.setSpan(node, 0, text.length);
   return new cvox.NavBraille({
     text: spannable,
diff --git a/chrome/browser/resources/chromeos/chromevox/walkers/layout_line_walker.js b/chrome/browser/resources/chromeos/chromevox/walkers/layout_line_walker.js
index ad8140e..b30dc53 100644
--- a/chrome/browser/resources/chromeos/chromevox/walkers/layout_line_walker.js
+++ b/chrome/browser/resources/chromeos/chromevox/walkers/layout_line_walker.js
@@ -216,7 +216,7 @@
   var item = this.subWalker_.getBraille(prevSel, cur).text;
   var valueSelectionSpan = item.getSpanInstanceOf(cvox.ValueSelectionSpan);
 
-  if (braille.text.getLength() > 0) {
+  if (braille.text.length > 0) {
     braille.text.append(cvox.BrailleUtil.ITEM_SEPARATOR);
   }
 
@@ -228,8 +228,8 @@
     node = node.parentNode;
   }
 
-  var nodeStart = braille.text.getLength();
-  var nodeEnd = nodeStart + item.getLength();
+  var nodeStart = braille.text.length;
+  var nodeEnd = nodeStart + item.length;
   braille.text.append(item);
   braille.text.setSpan(node, nodeStart, nodeEnd);
 
diff --git a/chrome/browser/resources/chromeos/chromevox/walkers/structural_line_walker.js b/chrome/browser/resources/chromeos/chromevox/walkers/structural_line_walker.js
index 3936248..a1f565b3 100644
--- a/chrome/browser/resources/chromeos/chromevox/walkers/structural_line_walker.js
+++ b/chrome/browser/resources/chromeos/chromevox/walkers/structural_line_walker.js
@@ -68,7 +68,7 @@
   }
   var spannable =
       cvox.BrailleUtil.getTemplated(prevNode, objNode, {name: name});
-  spannable.setSpan(objNode, 0, spannable.getLength());
+  spannable.setSpan(objNode, 0, spannable.length);
   braille.text = spannable;
 
   // Remove any selections.
diff --git a/chrome/browser/resources/chromeos/keyboard_overlay_data.js b/chrome/browser/resources/chromeos/keyboard_overlay_data.js
index 4b05680..771221a 100644
--- a/chrome/browser/resources/chromeos/keyboard_overlay_data.js
+++ b/chrome/browser/resources/chromeos/keyboard_overlay_data.js
@@ -15814,7 +15814,6 @@
     '9<>SEARCH': 'keyboardOverlayF9',
     '=<>SEARCH': 'keyboardOverlayF12',
     'ALT<>SEARCH': 'keyboardOverlayToggleCapsLock',
-    'ALT<>SHIFT': 'keyboardOverlayCycleThroughInputMethods',
     '[<>ALT': 'keyboardOverlayDockWindowLeft',
     ']<>ALT': 'keyboardOverlayDockWindowRight',
     'a<>CTRL': 'keyboardOverlaySelectAll',
@@ -15894,6 +15893,7 @@
     's<>ALT<>SHIFT': 'keyboardOverlayShowStatusMenu',
     's<>CTRL': 'keyboardOverlaySave',
     'space<>CTRL': 'keyboardOverlaySelectPreviousInputMethod',
+    'space<>CTRL<>SHIFT': 'keyboardOverlayCycleThroughInputMethods',
     'space<>SHIFT': 'keyboardOverlayScrollUpOnePage',
     'switch window<>CTRL': 'keyboardOverlayTakeScreenshot',
     'switch window<>CTRL<>SHIFT': 'keyboardOverlayScreenshotRegion',
diff --git a/chrome/browser/resources/md_extensions/icons.html b/chrome/browser/resources/md_extensions/icons.html
new file mode 100644
index 0000000..72b51e2
--- /dev/null
+++ b/chrome/browser/resources/md_extensions/icons.html
@@ -0,0 +1,21 @@
+<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
+
+<iron-iconset-svg name="extensions-icons" size="24">
+  <svg>
+    <defs>
+      <g id="pack">
+        <path d="M0 0h24v24H0z" fill="none"></path>
+        <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 6h-2v2h2v2h-2v-2h-2V9h2V7h-2V5h2v2h2v2zm0 8h-2v-2h-2v-2h2v2h2v2z"></path>
+      </g>
+      <g id="update">
+        <defs>
+          <path id="a" d="M0 0h24v24H0V0z"></path>
+        </defs>
+        <clipPath id="b">
+          <use xlink:href="#a" overflow="visible"></use>
+        </clipPath>
+        <path d="M7.3 5.3c-1.3 1.3-2 3-2 4.7 0 1.7.7 3.4 2 4.7l1.2-1.2c-1-1-1.5-2.3-1.5-3.5 0-1.3.5-2.6 1.5-3.5L7.3 5.3zm11.8-2.4l-1.2 1.2c1.6 1.6 2.4 3.8 2.4 5.9s-.8 4.3-2.4 5.9l1.2 1.2c2-2 2.9-4.5 2.9-7.1s-1-5.1-2.9-7.1zm-13 1.2L4.9 2.9C3 4.9 2 7.4 2 10s1 5.1 2.9 7.1l1.2-1.2c-1.6-1.6-2.4-3.8-2.4-5.9s.8-4.3 2.4-5.9zm10.6 1.2l-1.2 1.2c1 1 1.5 2.3 1.5 3.5 0 1.3-.5 2.6-1.5 3.5l1.2 1.2c1.3-1.3 2-3 2-4.7-.1-1.7-.7-3.4-2-4.7zM12 7.5c-1.4 0-2.5 1.1-2.5 2.5 0 1 .6 1.9 1.5 2.3V21h2v-8.7c.9-.4 1.5-1.3 1.5-2.3 0-1.4-1.1-2.5-2.5-2.5z" clip-path="url(#b)"></path>
+      </g>
+  </svg>
+</iron-icon-set>
diff --git a/chrome/browser/resources/md_extensions/manager.css b/chrome/browser/resources/md_extensions/manager.css
index 418fe5f..ca6fc3c 100644
--- a/chrome/browser/resources/md_extensions/manager.css
+++ b/chrome/browser/resources/md_extensions/manager.css
@@ -12,8 +12,14 @@
   };
 }
 
+extensions-item {
+  display: inline-block;
+  margin-top: 20px;
+}
+
 #item-list {
-  -webkit-margin-start: 250px;
+  -webkit-margin-start: 30px;
+  overflow-y: auto;
 }
 
 extensions-item {
diff --git a/chrome/browser/resources/md_extensions/service.js b/chrome/browser/resources/md_extensions/service.js
index 368c41d4..c3a61ae 100644
--- a/chrome/browser/resources/md_extensions/service.js
+++ b/chrome/browser/resources/md_extensions/service.js
@@ -167,6 +167,20 @@
       chrome.developerPrivate.updateProfileConfiguration(
           {inDeveloperMode: inDevMode});
     },
+
+    /** @override */
+    loadUnpacked: function() {
+      chrome.developerPrivate.loadUnpacked({failQuietly: true});
+    },
+
+    /** @override */
+    packExtension: function() {
+    },
+
+    /** @override */
+    updateAllExtensions: function() {
+      chrome.developerPrivate.autoUpdate();
+    },
   };
 
   cr.addSingletonGetter(Service);
diff --git a/chrome/browser/resources/md_extensions/sidebar.css b/chrome/browser/resources/md_extensions/sidebar.css
index a7c4b14..30618144 100644
--- a/chrome/browser/resources/md_extensions/sidebar.css
+++ b/chrome/browser/resources/md_extensions/sidebar.css
@@ -5,7 +5,7 @@
 :host {
   -webkit-margin-start: 30px;
   margin-top: 30px;
-  position: fixed;
+  white-space: nowrap;
 }
 
 #section-menu {
@@ -32,7 +32,7 @@
   -webkit-margin-start: 15px;
 }
 
-#developer-mode {
+#devtools-container {
   border-bottom: 1px solid #C5C5C5;
   border-top: 1px solid #C5C5C5;
   margin: 10px 0;
@@ -43,3 +43,7 @@
   --primary-text-color: #5A5A5A;
   -webkit-margin-start: 10px;
 }
+
+#devtools-controls {
+  -webkit-margin-start: 20px;
+}
diff --git a/chrome/browser/resources/md_extensions/sidebar.html b/chrome/browser/resources/md_extensions/sidebar.html
index 765eaa7..1f1b5b2 100644
--- a/chrome/browser/resources/md_extensions/sidebar.html
+++ b/chrome/browser/resources/md_extensions/sidebar.html
@@ -1,8 +1,10 @@
 <link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-menu/paper-menu.html">
+<link rel="import" href="chrome://extensions/icons.html">
 
 <dom-module id="extensions-sidebar">
   <template>
@@ -20,12 +22,33 @@
         <span i18n-content="sidebarWebsites"></span>
       </paper-item>
     </paper-menu>
-    <paper-item id="developer-mode">
-      <span i18n-content="developerMode"></span>
-      <paper-checkbox id="developer-mode-checkbox"
-          checked="[[inDevMode]]"
-          on-change="onDevModeChange_"></paper-checkbox>
-    </paper-item>
+    <div id="devtools-container">
+      <paper-item id="developer-mode">
+        <span i18n-content="developerMode"></span>
+        <paper-checkbox id="developer-mode-checkbox"
+            checked="[[inDevMode]]"
+            on-change="onDevModeChange_"></paper-checkbox>
+      </paper-item>
+      <template is="dom-if" if="[[inDevMode]]">
+        <div id="devtools-controls">
+          <paper-item class="section-menu-item" id="load-unpacked"
+              on-tap="onLoadUnpackedTap_">
+            <iron-icon icon="file-download"></iron-icon>
+            <span>[[i18n('sidebarLoadUnpacked')]]</span>
+          </paper-item>
+          <paper-item class="section-menu-item" id="pack-extensions"
+              on-tap="onPackTap_">
+            <iron-icon icon="extensions-icons:pack"></iron-icon>
+            <span>[[i18n('sidebarPack')]]</span>
+          </paper-item>
+          <paper-item class="section-menu-item" id="update-now"
+              on-tap="onUpdateNowTap_">
+            <iron-icon icon="extensions-icons:update"></iron-icon>
+            <span>[[i18n('sidebarUpdateNow')]]</span>
+          </paper-item>
+        </div>
+      </template>
+    </div>
     <paper-item id="more-extensions" i18n-content="getMoreExtensions">
     </paper-item>
     <paper-item id="keyboard-shortcuts" i18n-content="keyboardShortcuts">
diff --git a/chrome/browser/resources/md_extensions/sidebar.js b/chrome/browser/resources/md_extensions/sidebar.js
index 45bb7d3..6aebb54 100644
--- a/chrome/browser/resources/md_extensions/sidebar.js
+++ b/chrome/browser/resources/md_extensions/sidebar.js
@@ -12,6 +12,15 @@
      * @param {boolean} inDevMode
      */
     setProfileInDevMode: assertNotReached,
+
+    /** Opens the dialog to load unpacked extensions. */
+    loadUnpacked: assertNotReached,
+
+    /** Opens the dialog to pack an extension. */
+    packExtension: assertNotReached,
+
+    /** Updates all extensions. */
+    updateAllExtensions: assertNotReached,
   };
 
   var Sidebar = Polymer({
@@ -24,6 +33,10 @@
       },
     },
 
+    behaviors: [
+      I18nBehavior,
+    ],
+
     /** @param {extensions.SidebarDelegate} delegate */
     setDelegate: function(delegate) {
       this.delegate_ = delegate;
@@ -33,6 +46,18 @@
       this.delegate_.setProfileInDevMode(
           this.$['developer-mode-checkbox'].checked);
     },
+
+    onLoadUnpackedTap_: function() {
+      this.delegate_.loadUnpacked();
+    },
+
+    onPackTap_: function() {
+      this.delegate_.packExtension();
+    },
+
+    onUpdateNowTap_: function() {
+      this.delegate_.updateAllExtensions();
+    },
   });
 
   return {
diff --git a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.html b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.html
index c34daaf..d5f02ad 100644
--- a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.html
+++ b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.html
@@ -1,15 +1,10 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
-<link rel="import" href="../media_router_header/media_router_header.html">
 <dom-module name="issue-banner">
   <link rel="import" type="css" href="../../media_router_common.css">
   <link rel="import" type="css" href="issue_banner.css">
   <template>
-    <media-router-header id="issue-header"
-        view="[[currentView_]]" heading-text="[[headerText_]]"
-        hidden$="[[computeIsBlockingIssueHidden_(issue)]]">
-    </media-router-header>
     <div class$="[[computeIssueClass_(issue)]]">
       <div>
         <div hidden$="[[computeIsBlockingIssueHidden_(issue)]]">
diff --git a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
index a67e5dc5..a9cbff4 100644
--- a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
+++ b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
@@ -9,16 +9,6 @@
 
   properties: {
     /**
-     * The current view to be shown.
-     * @private {media_router.MediaRouterView}
-     */
-    currentView_: {
-      type: String,
-      readOnly: true,
-      value: media_router.MediaRouterView.ISSUE,
-    },
-
-    /**
      * The text shown in the default action button.
      * @private {string}
      */
@@ -28,16 +18,6 @@
     },
 
     /**
-     * The header text.
-     * @private {string}
-     */
-    headerText_: {
-      type: String,
-      readOnly: true,
-      value: loadTimeData.getString('issueHeader'),
-    },
-
-    /**
      * The issue to show.
      * @type {?media_router.Issue}
      */
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
index 51e7a018..05f4f29 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
@@ -88,7 +88,7 @@
 }
 
 #sink-list {
-  max-height: 200px;
+  max-height: 320px;
 }
 
 .sink-text {
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
index 990a3d9..a19e319 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -18,12 +18,13 @@
         heading-text="[[computeHeaderText_(currentView_, headerText)]]"
         arrow-drop-icon-disabled="[[computeIsLaunching_(currentLaunchingSinkId_)]]"
         tooltip="[[computeHeaderTooltip_(currentView_, headerTextTooltip)]]"
-        hidden$="[[computeHeaderHidden_(currentView_, issue)]]">
+        on-back-click="showSinkList_">
     </media-router-header>
     <template is="dom-if"
         if="[[computeIssueBannerShown_(currentView_, issue)]]">
       <issue-banner id="issue-banner" issue="[[issue]]"
-          class$="[[computeIssueBannerClass_(issue)]]">
+          class$="[[computeIssueBannerClass_(issue)]]"
+          on-issue-action-click="showSinkList_">
       </issue-banner>
     </template>
     <paper-menu id="cast-mode-list"
@@ -52,8 +53,6 @@
       </template>
     </paper-menu>
     <route-details id="route-details" route="[[currentRoute_]]"
-        sink="[[computeSinkForCurrentRoute_(currentRoute_)]]"
-        on-back-click="showSinkList_"
         on-close-route-click="onCloseRouteClick_"
         hidden$="[[computeRouteDetailsHidden_(currentView_, issue)]]">
     </route-details>
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
index a94a0c4e..aa86c5cb 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -100,6 +100,17 @@
     issue: {
       type: Object,
       value: null,
+      observer: 'maybeShowIssueView_',
+    },
+
+    /**
+     * The header text.
+     * @private {string}
+     */
+    issueHeaderText_: {
+      type: String,
+      readOnly: true,
+      value: loadTimeData.getString('issueHeader'),
     },
 
     /**
@@ -301,10 +312,15 @@
    */
   computeHeaderText_: function(view, headerText) {
     switch (view) {
-      case media_router.MediaRouterView.SINK_LIST:
-        return this.headerText;
       case media_router.MediaRouterView.CAST_MODE_LIST:
         return this.selectCastModeHeaderText_;
+      case media_router.MediaRouterView.ISSUE:
+        return this.issueHeaderText_;
+      case media_router.MediaRouterView.ROUTE_DETAILS:
+        return this.currentRoute_ ?
+            this.sinkMap_[this.currentRoute_.sinkId].name : '';
+      case media_router.MediaRouterView.SINK_LIST:
+        return this.headerText;
       default:
         return '';
     }
@@ -405,15 +421,6 @@
   },
 
   /**
-   * @param {?media_router.Route} route The current route.
-   * @return {?media_router.Sink} The sink associated with |route|.
-   * @private
-   */
-  computeSinkForCurrentRoute_: function(route) {
-    return route ? this.sinkMap_[route.sinkId] : null;
-  },
-
-  /**
    * @param {!media_router.Sink} sink The sink to determine an icon for.
    * @return {string} The Polymer <iron-icon> icon to use. The format is
    *     <iconset>:<icon>, where <iconset> is the set ID and <icon> is the name
@@ -532,6 +539,17 @@
   },
 
   /**
+   * Updates |currentView_| if there is a new blocking issue.
+   *
+   * @param {?media_router.Issue} issue The new issue.
+   * @private
+   */
+  maybeShowIssueView_: function(issue) {
+    if (!!issue && issue.isBlocking)
+      this.currentView_ = media_router.MediaRouterView.ISSUE;
+  },
+
+  /**
    * Handles a cast mode selection. Updates |headerText|, |headerTextTooltip|,
    * and |selectedCastModeValue_|.
    *
diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.html b/chrome/browser/resources/media_router/elements/route_details/route_details.html
index 33ab8e6..d0237e0 100644
--- a/chrome/browser/resources/media_router/elements/route_details/route_details.html
+++ b/chrome/browser/resources/media_router/elements/route_details/route_details.html
@@ -1,13 +1,9 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
-<link rel="import" href="../media_router_header/media_router_header.html">
 <dom-module id="route-details">
   <link rel="import" type="css" href="../../media_router_common.css">
   <link rel="import" type="css" href="route_details.css">
   <template>
-    <media-router-header id="route-details-header"
-        view="[[currentView_]]" heading-text="[[sink.name]]">
-    </media-router-header>
     <div id="route-information" hidden$="[[!isCustomControllerHidden_]]">
       <span>[[activityStatus_]]</span>
     </div>
diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.js b/chrome/browser/resources/media_router/elements/route_details/route_details.js
index 92ba82e..3519067 100644
--- a/chrome/browser/resources/media_router/elements/route_details/route_details.js
+++ b/chrome/browser/resources/media_router/elements/route_details/route_details.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // This Polymer element shows information from media that is currently cast
-// to a device. It is assumed that |route| and |sink| correspond to each other.
+// to a device.
 Polymer({
   is: 'route-details',
 
@@ -18,16 +18,6 @@
     },
 
     /**
-     * The current view to be shown.
-     * @private {media_router.MediaRouterView}
-     */
-    currentView_: {
-      type: String,
-      readOnly: true,
-      value: media_router.MediaRouterView.ROUTE_DETAILS,
-    },
-
-    /**
      * The route to show.
      * @type {?media_router.Route}
      */
@@ -38,15 +28,6 @@
     },
 
     /**
-     * The sink to show.
-     * @type {?media_router.Sink}
-     */
-    sink: {
-      type: Object,
-      value: null,
-    },
-
-    /**
      * The text for the stop casting button.
      * @private {string}
      */
diff --git a/chrome/browser/resources/options/chromeos/change_picture_options.css b/chrome/browser/resources/options/chromeos/change_picture_options.css
index 9ca91f8..a7378e7 100644
--- a/chrome/browser/resources/options/chromeos/change_picture_options.css
+++ b/chrome/browser/resources/options/chromeos/change_picture_options.css
@@ -80,10 +80,6 @@
   display: none;
 }
 
-.animation #user-image-preview-img {
-  -webkit-transition: -webkit-transform 200ms linear;
-}
-
 .camera.flip-x #user-image-preview-img {
   -webkit-transform: rotateY(180deg);
 }
@@ -98,9 +94,6 @@
 }
 
 #user-image-stream-crop {
-  /* TODO(ivankr): temporary workaround for crbug.com/142347. */
-  -webkit-transform: rotateY(360deg);
-  -webkit-transition: -webkit-transform 200ms linear;
   height: 220px;
   overflow: hidden;
   position: relative;
diff --git a/chrome/browser/resources/options/clear_browser_data_overlay.html b/chrome/browser/resources/options/clear_browser_data_overlay.html
index c77344ec..dabc911c 100644
--- a/chrome/browser/resources/options/clear_browser_data_overlay.html
+++ b/chrome/browser/resources/options/clear_browser_data_overlay.html
@@ -58,6 +58,7 @@
           <input id="delete-form-data-checkbox"
               pref="browser.clear_data.form_data" type="checkbox">
           <span i18n-content="deleteFormDataCheckbox"></span>
+          <span class="clear-browser-data-counter"></span>
         </label>
       </div>
       <div id="delete-hosted-apps-data-container" class="checkbox">
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.css b/chrome/browser/resources/settings/a11y_page/a11y_page.css
index 6ad53260..65537ee 100644
--- a/chrome/browser/resources/settings/a11y_page/a11y_page.css
+++ b/chrome/browser/resources/settings/a11y_page/a11y_page.css
@@ -18,7 +18,3 @@
 .more-a11y-link {
   margin-bottom: 10px;
 }
-
-.button-strip {
-  text-align: end;
-}
diff --git a/chrome/browser/resources/settings/settings_page/settings_page.css b/chrome/browser/resources/settings/settings_page/settings_page.css
index 687708b..d0dd101 100644
--- a/chrome/browser/resources/settings/settings_page/settings_page.css
+++ b/chrome/browser/resources/settings/settings_page/settings_page.css
@@ -70,3 +70,7 @@
   /* Same padding as paper-icon-button. */
   padding: 8px;
 }
+
+.button-strip {
+  text-align: end;
+}
diff --git a/chrome/browser/resources/settings/signin_page/signin_page.html b/chrome/browser/resources/settings/signin_page/signin_page.html
index adba474..c9ca9d1 100644
--- a/chrome/browser/resources/settings/signin_page/signin_page.html
+++ b/chrome/browser/resources/settings/signin_page/signin_page.html
@@ -1,7 +1,11 @@
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-dialog/paper-dialog.html">
 <link rel="import" href="chrome://md-settings/sync_page/sync_page.html">
+<link rel="import" href="chrome://md-settings/sync_page/sync_private_api.html">
 <link rel="import" href="chrome://md-settings/settings_page/settings_animated_pages.html">
 <link rel="import" href="chrome://md-settings/settings_page/settings_subheader.html">
 
@@ -12,8 +16,20 @@
     <settings-animated-pages id="pages" current-route="{{currentRoute}}"
         section="signin">
       <neon-animatable id="main">
-        <paper-button i18n-content="syncPageTitle" on-tap="onSyncTap_" raised>
+        <div id="syncStatusText"></div>
+
+        <paper-button on-tap="onDisconnectTap_" raised
+            hidden="[[!syncStatus.signedIn]]"
+            disabled="[[syncStatus.setupInProgress]]"
+            i18n-content="syncDisconnect">
         </paper-button>
+
+        <template is="dom-if"
+            if="[[isAdvancedSyncSettingsVisible_(syncStatus)]]">
+          <paper-button on-tap="onSyncTap_" raised>
+            [[i18n('syncPageTitle')]]
+          </paper-button>
+        </template>
       </neon-animatable>
       <neon-animatable id="sync">
         <settings-subheader i18n-values="page-title:syncPageTitle">
@@ -22,6 +38,23 @@
         </settings-sync-page>
       </neon-animatable>
     </settings-animated-pages>
+
+    <paper-dialog modal id="disconnectDialog">
+      <h2 i18n-content="syncDisconnectTitle"></h2>
+      <div i18n-values=".innerHTML:syncDisconnectExplanation"></div>
+<if expr="(not chromeos and is_posix) or is_win or is_macosx">
+      <paper-checkbox id="syncSetupDeleteProfile"
+          i18n-content="syncDisconnectDeleteProfile">
+      </paper-checkbox>
+</if>
+      <div class="button-strip">
+        <paper-button dialog-dismiss i18n-content="cancel">
+        </paper-button>
+        <paper-button dialog-confirm raised
+            i18n-content="syncDisconnectConfirm">
+        </paper-button>
+      </div>
+    </paper-dialog>
   </template>
   <script src="signin_page.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/signin_page/signin_page.js b/chrome/browser/resources/settings/signin_page/signin_page.js
index 5618bab..ea86ede3 100644
--- a/chrome/browser/resources/settings/signin_page/signin_page.js
+++ b/chrome/browser/resources/settings/signin_page/signin_page.js
@@ -19,6 +19,10 @@
 Polymer({
   is: 'settings-signin-page',
 
+  behaviors: [
+    I18nBehavior,
+  ],
+
   properties: {
     /**
      * The current active route.
@@ -27,10 +31,48 @@
       type: Object,
       notify: true,
     },
+
+    /**
+     * The current sync status, supplied by settings.SyncPrivateApi.
+     * @type {?settings.SyncPrivateApi.SyncStatus}
+     */
+    syncStatus: Object,
+  },
+
+  created: function() {
+    settings.SyncPrivateApi.setSyncStatusCallback(
+        this.handleSyncStatusFetched_.bind(this));
+  },
+
+  /**
+   * Handler for when the sync state is pushed from settings.SyncPrivateApi.
+   * @private
+   */
+  handleSyncStatusFetched_: function(syncStatus) {
+    this.syncStatus = syncStatus;
+
+    // TODO(tommycli): Remove once we figure out how to refactor the sync
+    // code to not include HTML in the status messages.
+    this.$.syncStatusText.innerHTML = syncStatus.statusText;
+  },
+
+  /** @private */
+  onDisconnectTap_: function() {
+    this.$.disconnectDialog.open();
   },
 
   /** @private */
   onSyncTap_: function() {
     this.$.pages.setSubpageChain(['sync']);
   },
+
+  /**
+   * @private
+   * @return {boolean}
+   */
+  isAdvancedSyncSettingsVisible_: function() {
+    var status = this.syncStatus;
+    return status && status.signedIn && !status.managed &&
+           status.syncSystemEnabled;
+  },
 });
diff --git a/chrome/browser/resources/settings/sync_page/sync_private_api.js b/chrome/browser/resources/settings/sync_page/sync_private_api.js
index 14375a9..2324de0 100644
--- a/chrome/browser/resources/settings/sync_page/sync_private_api.js
+++ b/chrome/browser/resources/settings/sync_page/sync_private_api.js
@@ -60,6 +60,24 @@
   SyncPrivateApi.SyncPrefs;
 
   /**
+   * @typedef {{actionLinkText: (string|undefined),
+   *            childUser: (boolean|undefined),
+   *            hasError: (boolean|undefined),
+   *            hasUnrecoverableError: (boolean|undefined),
+   *            managed: (boolean|undefined),
+   *            setupCompleted: (boolean|undefined),
+   *            setupInProgress: (boolean|undefined),
+   *            signedIn: (boolean|undefined),
+   *            signinAllowed: (boolean|undefined),
+   *            signoutAllowed: (boolean|undefined),
+   *            statusText: (string|undefined),
+   *            supervisedUser: (boolean|undefined),
+   *            syncSystemEnabled: (boolean|undefined)}}
+   * @see chrome/browser/ui/webui/settings/sync_handler.cc
+   */
+  SyncPrivateApi.SyncStatus;
+
+  /**
    * @enum {string}
    */
   SyncPrivateApi.PageStatus = {
@@ -135,11 +153,24 @@
   };
 
   /**
-   * Legacy object called by SyncSetupHandler. It's an inconsistent name, but
-   * needed to allow a single handler to support both old and new Sync settings.
-   * TODO(tommycli): Remove when old Sync in Options is removed.
+   * Sets the callback to be invoked when sync status has been fetched.
+   * Also requests an initial sync status update.
+   * @param {!function(SyncPrivateApi.SyncStatus)} callback
    */
-  function SyncSetupOverlay() {}
+  SyncPrivateApi.setSyncStatusCallback = function(callback) {
+    SyncPrivateApi.syncStatusCallback_ = callback;
+    chrome.send('SyncSetupGetSyncStatus');
+  };
+
+  /**
+   * Handler for when sync status has been fetched from C++.
+   * @param {!SyncPrivateApi.SyncStatus} syncStatusFromCpp
+   * @private
+   */
+  SyncPrivateApi.sendSyncStatus = function(syncStatusFromCpp) {
+    if (SyncPrivateApi.syncStatusCallback_)
+      SyncPrivateApi.syncStatusCallback_(syncStatusFromCpp);
+  };
 
   /**
    * This function encapsulates the logic that maps from the legacy
@@ -147,7 +178,7 @@
    * @param {!SyncPrivateApi.PageStatus} status
    * @param {!SyncPrivateApi.SyncPrefs} prefs
    */
-  SyncSetupOverlay.showSyncSetupPage = function(status, prefs) {
+  SyncPrivateApi.showSyncSetupPage = function(status, prefs) {
     switch (status) {
       case SyncPrivateApi.PageStatus.TIMEOUT:
       case SyncPrivateApi.PageStatus.DONE:
@@ -169,9 +200,5 @@
 
   return {
     SyncPrivateApi: SyncPrivateApi,
-    SyncSetupOverlay: SyncSetupOverlay,
   };
 });
-
-// Must be global for the legacy C++ handler to call.
-var SyncSetupOverlay = settings.SyncSetupOverlay;
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
index 7c00318..6956e97 100644
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -17,10 +17,3 @@
     "metadata.proto",
   ]
 }
-
-# GYP version: chrome/chrome_browser.gypi:safe_browsing_report_proto
-proto_library("report_proto") {
-  sources = [
-    "report.proto",
-  ]
-}
diff --git a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
index a5d889d..8f79a69 100644
--- a/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc
@@ -229,7 +229,10 @@
             (uint8_t)state.modification(1).modified_bytes()[0]);
 }
 
-TEST_F(SafeBrowsingModuleVerifierWinTest, VerifyModuleLongModification) {
+// Disabled because it fails about 80% of the time on XP.
+// http://crbug.com/549564
+TEST_F(SafeBrowsingModuleVerifierWinTest,
+       DISABLED_VerifyModuleLongModification) {
   ModuleState state;
   int num_bytes_different = 0;
 
@@ -275,7 +278,9 @@
       state.modification(0).modified_bytes());
 }
 
-TEST_F(SafeBrowsingModuleVerifierWinTest, VerifyModuleRelocOverlap) {
+// Disabled because it fails about 80% of the time on XP.
+// http://crbug.com/549564
+TEST_F(SafeBrowsingModuleVerifierWinTest, DISABLED_VerifyModuleRelocOverlap) {
   int num_bytes_different = 0;
   ModuleState state;
 
diff --git a/chrome/browser/safe_browsing/report.proto b/chrome/browser/safe_browsing/report.proto
deleted file mode 100644
index 38dcea4..0000000
--- a/chrome/browser/safe_browsing/report.proto
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Safe Browsing reporting protocol buffers.
-//
-// A ClientMalwareReportRequest is sent when a user opts-in to 
-// sending detailed malware reports from the safe browsing interstitial page.
-// 
-// It is a list of Resource messages, which may contain the url of a
-// resource such as the page in the address bar or any other resource
-// that was loaded for this page.
-//
-// In addition to the url, a resource can contain HTTP request and response
-// headers and bodies.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package safe_browsing;
-
-message ClientMalwareReportRequest {
-
-  message HTTPHeader {
-    required bytes name = 1;
-    optional bytes value = 2;
-  }
-
-  message HTTPRequest {
-    message FirstLine {
-      optional bytes verb = 1;  // Also known as method, eg "GET"
-      optional bytes uri = 2;
-      optional bytes version = 3;
-    }
-    
-    optional FirstLine firstline = 1;
-    repeated HTTPHeader headers = 2;
-    optional bytes body = 3;
-
-    // bodydigest and bodylength can be useful if the report does not
-    // contain the body itself.
-    optional bytes bodydigest = 4;  
-    optional int32 bodylength = 5;
-  }
-
-  message HTTPResponse {
-    message FirstLine {
-      optional int32 code = 1;
-      optional bytes reason = 2;
-      optional bytes version = 3;
-    }
-
-    optional FirstLine firstline = 1;
-    repeated HTTPHeader headers = 2;
-    optional bytes body = 3;
-
-    // bodydigest and bodylength can be useful if the report does not
-    // contain the body itself.
-    optional bytes bodydigest = 4;
-    optional int32 bodylength = 5;
-    optional bytes remote_ip = 6;
-  }
-
-  message Resource {
-    required int32 id = 1;
-    optional string url = 2;
-    optional HTTPRequest request = 3;
-    optional HTTPResponse response = 4;
-
-    optional int32 parent_id = 5;  // Id of the parent, if known.
-
-    // A list of children. The order of the children in this list is
-    // significant. The |parent_id| field for child nodes can be derived
-    // from this, but this allows us to be more flexible.
-    repeated int32 child_ids = 6;
-
-    // Tag that was used to include this resource, eg "iframe"
-    optional string tag_name = 7;
-  }
-
-  // URL of the resource that matches the safe browsing list.
-  optional string malware_url = 1;
-
-  // URL of the page in the address bar.
-  optional string page_url = 2;
-
-  optional string referrer_url = 3;
-  repeated Resource resources = 4;
-
-  // Whether the report has HTTP Responses.
-  optional bool complete = 5;
-
-  // Whether user chose to proceed.
-  optional bool did_proceed = 8;
-
-  // Whether user visited this origin before.
-  optional bool repeat_visit = 9;
-}
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
index b684fabe..176e712 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
@@ -193,20 +193,29 @@
     navigation_entry_index_to_remove_ = -1;
   }
 
-  // Start computing malware details. They will be sent only
+  // Start computing threat details. They will be sent only
   // if the user opts-in on the blocking page later.
   // If there's more than one malicious resources, it means the user
   // clicked through the first warning, so we don't prepare additional
   // reports.
   if (unsafe_resources.size() == 1 &&
-      unsafe_resources[0].threat_type == SB_THREAT_TYPE_URL_MALWARE &&
-      threat_details_.get() == NULL && CanShowMalwareDetailsOption()) {
+      ShouldReportThreatDetails(unsafe_resources[0].threat_type) &&
+      threat_details_.get() == NULL && CanShowThreatDetailsOption()) {
     threat_details_ = ThreatDetails::NewThreatDetails(ui_manager_, web_contents,
                                                       unsafe_resources[0]);
   }
 }
 
-bool SafeBrowsingBlockingPage::CanShowMalwareDetailsOption() {
+bool SafeBrowsingBlockingPage::ShouldReportThreatDetails(
+    SBThreatType threat_type) {
+  return threat_type == SB_THREAT_TYPE_URL_PHISHING ||
+         threat_type == SB_THREAT_TYPE_URL_MALWARE ||
+         threat_type == SB_THREAT_TYPE_URL_UNWANTED ||
+         threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL ||
+         threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL;
+}
+
+bool SafeBrowsingBlockingPage::CanShowThreatDetailsOption() {
   return (!web_contents()->GetBrowserContext()->IsOffTheRecord() &&
           web_contents()->GetURL().SchemeIs(url::kHttpScheme) &&
           IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingOptInAllowed));
@@ -348,7 +357,7 @@
 
 void SafeBrowsingBlockingPage::OnProceed() {
   proceeded_ = true;
-  // Send the malware details, if we opted to.
+  // Send the threat details, if we opted to.
   FinishThreatDetails(malware_details_proceed_delay_ms_, true, /* did_proceed */
                       metrics_helper()->NumVisits());
 
@@ -429,8 +438,7 @@
                                                    bool did_proceed,
                                                    int num_visits) {
   if (threat_details_.get() == NULL)
-    return;  // Not all interstitials have malware details (eg phishing).
-  DCHECK_EQ(interstitial_reason_, SB_REASON_MALWARE);
+    return;  // Not all interstitials have threat details (eg., incognito mode).
 
   const bool enabled =
       IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled) &&
@@ -616,7 +624,7 @@
 void SafeBrowsingBlockingPage::PopulateExtendedReportingOption(
     base::DictionaryValue* load_time_data) {
   // Only show checkbox if !(HTTPS || incognito-mode).
-  const bool show = CanShowMalwareDetailsOption();
+  const bool show = CanShowThreatDetailsOption();
   load_time_data->SetBoolean(interstitials::kDisplayCheckBox, show);
   if (!show)
     return;
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
index c2ab371..97e27cb 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
@@ -86,6 +86,9 @@
   void OverrideRendererPrefs(content::RendererPreferences* prefs) override;
   content::InterstitialPageDelegate::TypeID GetTypeForTesting() const override;
 
+  // Checks the threat type to decide if we should report ThreatDetails.
+  static bool ShouldReportThreatDetails(SBThreatType threat_type);
+
  protected:
   friend class SafeBrowsingBlockingPageTest;
   FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest,
@@ -114,9 +117,9 @@
   FRIEND_TEST_ALL_PREFIXES(SafeBrowsingBlockingPageTest,
       MalwareReportsToggling);
 
-  // Checks if we should even show the malware details option. For example, we
+  // Checks if we should even show the threat details option. For example, we
   // don't show it in incognito mode.
-  bool CanShowMalwareDetailsOption();
+  bool CanShowThreatDetailsOption();
 
   // Called when the insterstitial is going away. If there is a
   // pending threat details object, we look at the user's
@@ -173,7 +176,7 @@
   } interstitial_reason_;
 
   // The factory used to instantiate SafeBrowsingBlockingPage objects.
-  // Usefull for tests, so they can provide their own implementation of
+  // Useful for tests, so they can provide their own implementation of
   // SafeBrowsingBlockingPage.
   static SafeBrowsingBlockingPageFactory* factory_;
 
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index 9decd2a..7d4aa23 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -244,7 +244,7 @@
         waiting_(false) {}
 
   void AddDOMDetails(
-      const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params)
+      const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params)
       override {
     EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
     ThreatDetails::AddDOMDetails(params);
@@ -260,7 +260,7 @@
       return;
     }
     // This condition might not trigger normally, but if you add a
-    // sleep(1) in malware_dom_details it triggers :).
+    // sleep(1) in threat_dom_details it triggers :).
     waiting_ = true;
     content::RunMessageLoop();
     EXPECT_TRUE(got_dom_);
@@ -350,7 +350,7 @@
       const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
       override {
     return new TestSafeBrowsingBlockingPage(delegate, web_contents,
-                                              unsafe_resources);
+                                            unsafe_resources);
   }
 };
 
@@ -710,26 +710,27 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
-                       IframeOptInAndReportMalwareDetails) {
+                       IframeOptInAndReportThreatDetails) {
   // The extended reporting opt-in is presented in the interstitial for malware,
-  // phishing, and UwS threats. It however only results in uploading further
-  // details about the immediate threat when facing malware threats.
-  const bool expect_malware_details = GetParam() == SB_THREAT_TYPE_URL_MALWARE;
+  // phishing, and UwS threats. This test uses malware as an example to verify
+  // this reporting functionality.
+  const bool expect_threat_details =
+      SafeBrowsingBlockingPage::ShouldReportThreatDetails(GetParam());
 
-  scoped_refptr<content::MessageLoopRunner> malware_report_sent_runner(
+  scoped_refptr<content::MessageLoopRunner> threat_report_sent_runner(
       new content::MessageLoopRunner);
-  if (expect_malware_details)
-    SetReportSentCallback(malware_report_sent_runner->QuitClosure());
+  if (expect_threat_details)
+    SetReportSentCallback(threat_report_sent_runner->QuitClosure());
 
   GURL url = SetupThreatIframeWarningAndNavigate();
 
-  FakeThreatDetails* fake_malware_details = details_factory_.get_details();
-  EXPECT_EQ(expect_malware_details, fake_malware_details != nullptr);
+  FakeThreatDetails* fake_threat_details = details_factory_.get_details();
+  EXPECT_EQ(expect_threat_details, fake_threat_details != nullptr);
 
   // If the DOM details from renderer did not already return when they are
   // expected, wait for them.
-  if (expect_malware_details)
-    fake_malware_details->WaitForDOM();
+  if (expect_threat_details)
+    fake_threat_details->WaitForDOM();
 
   EXPECT_EQ(VISIBLE, GetVisibility("extended-reporting-opt-in"));
   EXPECT_TRUE(Click("opt-in-checkbox"));
@@ -741,10 +742,10 @@
   EXPECT_EQ(url,
             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
 
-  if (expect_malware_details) {
-    malware_report_sent_runner->Run();
+  if (expect_threat_details) {
+    threat_report_sent_runner->Run();
     std::string serialized = GetReportSent();
-    safe_browsing::ClientMalwareReportRequest report;
+    safe_browsing::ClientSafeBrowsingReportRequest report;
     ASSERT_TRUE(report.ParseFromString(serialized));
     // Verify the report is complete.
     EXPECT_TRUE(report.complete());
diff --git a/chrome/browser/safe_browsing/threat_details.cc b/chrome/browser/safe_browsing/threat_details.cc
index 50d956d9..f72f6d5d 100644
--- a/chrome/browser/safe_browsing/threat_details.cc
+++ b/chrome/browser/safe_browsing/threat_details.cc
@@ -2,14 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Implementation of the MalwareDetails class.
+// Implementation of the ThreatDetails class.
 
 #include "chrome/browser/safe_browsing/threat_details.h"
 
 #include "base/bind.h"
 #include "base/lazy_instance.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/safe_browsing/report.pb.h"
 #include "chrome/browser/safe_browsing/threat_details_cache.h"
 #include "chrome/browser/safe_browsing/threat_details_history.h"
 #include "chrome/common/safe_browsing/safebrowsing_messages.h"
@@ -23,14 +22,40 @@
 using content::BrowserThread;
 using content::NavigationEntry;
 using content::WebContents;
-using safe_browsing::ClientMalwareReportRequest;
+using safe_browsing::ClientSafeBrowsingReportRequest;
 
-// Keep in sync with KMaxNodes in renderer/safe_browsing/malware_dom_details
+// Keep in sync with KMaxNodes in renderer/safe_browsing/threat_dom_details
 static const uint32 kMaxDomNodes = 500;
 
 // static
 ThreatDetailsFactory* ThreatDetails::factory_ = NULL;
 
+namespace {
+
+// Helper function that converts SBThreatType to
+// ClientSafeBrowsingReportRequest::ReportType.
+ClientSafeBrowsingReportRequest::ReportType GetReportTypeFromSBThreatType(
+    SBThreatType threat_type) {
+  switch (threat_type) {
+    case SB_THREAT_TYPE_URL_PHISHING:
+      return ClientSafeBrowsingReportRequest::URL_PHISHING;
+    case SB_THREAT_TYPE_URL_MALWARE:
+      return ClientSafeBrowsingReportRequest::URL_MALWARE;
+    case SB_THREAT_TYPE_URL_UNWANTED:
+      return ClientSafeBrowsingReportRequest::URL_UNWANTED;
+    case SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL:
+      return ClientSafeBrowsingReportRequest::CLIENT_SIDE_PHISHING_URL;
+    case SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL:
+      return ClientSafeBrowsingReportRequest::CLIENT_SIDE_MALWARE_URL;
+    default:  // Gated by SafeBrowsingBlockingPage::ShouldReportThreatDetails.
+      NOTREACHED() << "We should not send report for threat type "
+                   << threat_type;
+      return ClientSafeBrowsingReportRequest::UNKNOWN;
+  }
+}
+
+}  // namespace
+
 // The default ThreatDetailsFactory.  Global, made a singleton so we
 // don't leak it.
 class ThreatDetailsFactoryImpl : public ThreatDetailsFactory {
@@ -51,7 +76,7 @@
 };
 
 static base::LazyInstance<ThreatDetailsFactoryImpl>
-    g_malware_details_factory_impl = LAZY_INSTANCE_INITIALIZER;
+    g_threat_details_factory_impl = LAZY_INSTANCE_INITIALIZER;
 
 // Create a ThreatDetails for the given tab.
 /* static */
@@ -62,7 +87,7 @@
   // Set up the factory if this has not been done already (tests do that
   // before this method is called).
   if (!factory_)
-    factory_ = g_malware_details_factory_impl.Pointer();
+    factory_ = g_threat_details_factory_impl.Pointer();
   return factory_->CreateThreatDetails(ui_manager, web_contents, resource);
 }
 
@@ -86,7 +111,7 @@
 bool ThreatDetails::OnMessageReceived(const IPC::Message& message) {
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(ThreatDetails, message)
-    IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_MalwareDOMDetails,
+    IPC_MESSAGE_HANDLER(SafeBrowsingHostMsg_ThreatDOMDetails,
                         OnReceivedThreatDOMDetails)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
@@ -102,7 +127,7 @@
 // updates |resource|. Otherwise, it creates a new message, adds it to
 // resources_ and updates |resource| to point to it.
 //
-ClientMalwareReportRequest::Resource* ThreatDetails::FindOrCreateResource(
+ClientSafeBrowsingReportRequest::Resource* ThreatDetails::FindOrCreateResource(
     const GURL& url) {
   safe_browsing::ResourceMap::iterator it = resources_.find(url.spec());
   if (it != resources_.end())
@@ -110,8 +135,8 @@
 
   // Create the resource for |url|.
   int id = resources_.size();
-  linked_ptr<ClientMalwareReportRequest::Resource> new_resource(
-      new ClientMalwareReportRequest::Resource());
+  linked_ptr<ClientSafeBrowsingReportRequest::Resource> new_resource(
+      new ClientSafeBrowsingReportRequest::Resource());
   new_resource->set_url(url.spec());
   new_resource->set_id(id);
   resources_[url.spec()] = new_resource;
@@ -126,13 +151,13 @@
     return;
 
   // Find (or create) the resource for the url.
-  ClientMalwareReportRequest::Resource* url_resource =
+  ClientSafeBrowsingReportRequest::Resource* url_resource =
       FindOrCreateResource(url);
   if (!tagname.empty())
     url_resource->set_tag_name(tagname);
   if (!parent.is_empty() && IsReportableUrl(parent)) {
     // Add the resource for the parent.
-    ClientMalwareReportRequest::Resource* parent_resource =
+    ClientSafeBrowsingReportRequest::Resource* parent_resource =
         FindOrCreateResource(parent);
     // Update the parent-child relation
     url_resource->set_parent_id(parent_resource->id());
@@ -140,7 +165,7 @@
   if (children) {
     for (std::vector<GURL>::const_iterator it = children->begin();
          it != children->end(); ++it) {
-      ClientMalwareReportRequest::Resource* child_resource =
+      ClientSafeBrowsingReportRequest::Resource* child_resource =
           FindOrCreateResource(*it);
       url_resource->add_child_ids(child_resource->id());
     }
@@ -148,11 +173,13 @@
 }
 
 void ThreatDetails::StartCollection() {
-  DVLOG(1) << "Starting to compute malware details.";
-  report_.reset(new ClientMalwareReportRequest());
+  DVLOG(1) << "Starting to compute threat details.";
+  report_.reset(new ClientSafeBrowsingReportRequest());
 
-  if (IsReportableUrl(resource_.url))
-    report_->set_malware_url(resource_.url.spec());
+  if (IsReportableUrl(resource_.url)) {
+    report_->set_url(resource_.url.spec());
+    report_->set_type(GetReportTypeFromSBThreatType(resource_.threat_type));
+  }
 
   GURL page_url = web_contents()->GetURL();
   if (IsReportableUrl(page_url))
@@ -202,12 +229,12 @@
   // Get URLs of frames, scripts etc from the DOM.
   // OnReceivedThreatDOMDetails will be called when the renderer replies.
   content::RenderViewHost* view = web_contents()->GetRenderViewHost();
-  view->Send(new SafeBrowsingMsg_GetMalwareDOMDetails(view->GetRoutingID()));
+  view->Send(new SafeBrowsingMsg_GetThreatDOMDetails(view->GetRoutingID()));
 }
 
 // When the renderer is done, this is called.
 void ThreatDetails::OnReceivedThreatDOMDetails(
-    const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params) {
+    const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params) {
   // Schedule this in IO thread, so it doesn't conflict with future users
   // of our data structures (eg GetSerializedReport).
   BrowserThread::PostTask(
@@ -216,7 +243,7 @@
 }
 
 void ThreatDetails::AddDOMDetails(
-    const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params) {
+    const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DVLOG(1) << "Nodes from the DOM: " << params.size();
 
@@ -233,7 +260,7 @@
   // Add the urls from the DOM to |resources_|.  The renderer could be
   // sending bogus messages, so limit the number of nodes we accept.
   for (size_t i = 0; i < params.size() && i < kMaxDomNodes; ++i) {
-    SafeBrowsingHostMsg_MalwareDOMDetails_Node node = params[i];
+    SafeBrowsingHostMsg_ThreatDOMDetails_Node node = params[i];
     DVLOG(1) << node.url << ", " << node.tag_name << ", " << node.parent;
     AddUrl(node.url, node.parent, node.tag_name, &(node.children));
   }
@@ -284,7 +311,7 @@
   // Add all the urls in our |resources_| maps to the |report_| protocol buffer.
   for (safe_browsing::ResourceMap::const_iterator it = resources_.begin();
        it != resources_.end(); ++it) {
-    ClientMalwareReportRequest::Resource* pb_resource =
+    ClientSafeBrowsingReportRequest::Resource* pb_resource =
         report_->add_resources();
     pb_resource->CopyFrom(*(it->second));
     const GURL url(pb_resource->url());
@@ -307,9 +334,8 @@
   // Send the report, using the SafeBrowsingService.
   std::string serialized;
   if (!report_->SerializeToString(&serialized)) {
-    DLOG(ERROR) << "Unable to serialize the malware report.";
+    DLOG(ERROR) << "Unable to serialize the threat report.";
     return;
   }
-
   ui_manager_->SendSerializedThreatDetails(serialized);
 }
diff --git a/chrome/browser/safe_browsing/threat_details.h b/chrome/browser/safe_browsing/threat_details.h
index 58f9451..ef9f8b3 100644
--- a/chrome/browser/safe_browsing/threat_details.h
+++ b/chrome/browser/safe_browsing/threat_details.h
@@ -20,8 +20,8 @@
 #include "base/memory/linked_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
-#include "chrome/browser/safe_browsing/report.pb.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
+#include "chrome/common/safe_browsing/csd.pb.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "net/base/completion_callback.h"
 
@@ -33,13 +33,13 @@
 class ThreatDetailsRedirectsCollector;
 class ThreatDetailsFactory;
 class Profile;
-struct SafeBrowsingHostMsg_MalwareDOMDetails_Node;
+struct SafeBrowsingHostMsg_ThreatDOMDetails_Node;
 
 namespace safe_browsing {
 // Maps a URL to its Resource.
 typedef base::hash_map<
     std::string,
-    linked_ptr<safe_browsing::ClientMalwareReportRequest::Resource>>
+    linked_ptr<safe_browsing::ClientSafeBrowsingReportRequest::Resource>>
     ResourceMap;
 }
 
@@ -85,12 +85,12 @@
 
   // Called on the IO thread with the DOM details.
   virtual void AddDOMDetails(
-      const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params);
+      const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params);
 
   Profile* profile_;
 
   // The report protocol buffer.
-  scoped_ptr<safe_browsing::ClientMalwareReportRequest> report_;
+  scoped_ptr<safe_browsing::ClientSafeBrowsingReportRequest> report_;
 
   // Used to get a pointer to the HTTP cache.
   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
@@ -107,8 +107,8 @@
   // Finds an existing Resource for the given url, or creates a new
   // one if not found, and adds it to |resources_|. Returns the
   // found/created resource.
-  safe_browsing::ClientMalwareReportRequest::Resource* FindOrCreateResource(
-      const GURL& url);
+  safe_browsing::ClientSafeBrowsingReportRequest::Resource*
+  FindOrCreateResource(const GURL& url);
 
   // Adds a Resource to resources_ with the given parent-child
   // relationship. |parent| and |tagname| can be empty, |children| can be NULL.
@@ -119,7 +119,7 @@
 
   // Message handler.
   void OnReceivedThreatDOMDetails(
-      const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params);
+      const std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>& params);
 
   void AddRedirectUrlList(const std::vector<GURL>& urls);
 
@@ -152,7 +152,7 @@
   // Used to collect redirect urls from the history service
   scoped_refptr<ThreatDetailsRedirectsCollector> redirects_collector_;
 
-  FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, MalwareDOMDetails);
+  FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, ThreatDOMDetails);
   FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, HTTPCache);
   FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, HTTPCacheNoEntries);
   FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, HistoryServiceUrls);
diff --git a/chrome/browser/safe_browsing/threat_details_cache.cc b/chrome/browser/safe_browsing/threat_details_cache.cc
index 05a78e0..73c1b23f2 100644
--- a/chrome/browser/safe_browsing/threat_details_cache.cc
+++ b/chrome/browser/safe_browsing/threat_details_cache.cc
@@ -10,9 +10,9 @@
 #include "base/lazy_instance.h"
 #include "base/md5.h"
 #include "base/strings/string_util.h"
-#include "chrome/browser/safe_browsing/report.pb.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/safe_browsing/threat_details_cache.h"
+#include "chrome/common/safe_browsing/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/load_flags.h"
@@ -23,7 +23,7 @@
 #include "net/url_request/url_request_status.h"
 
 using content::BrowserThread;
-using safe_browsing::ClientMalwareReportRequest;
+using safe_browsing::ClientSafeBrowsingReportRequest;
 
 // Only send small files for now, a better strategy would use the size
 // of the whole report and the user's bandwidth.
@@ -87,8 +87,8 @@
   current_fetch_->Start();  // OnURLFetchComplete will be called when done.
 }
 
-ClientMalwareReportRequest::Resource* ThreatDetailsCacheCollector::GetResource(
-    const GURL& url) {
+ClientSafeBrowsingReportRequest::Resource*
+ThreatDetailsCacheCollector::GetResource(const GURL& url) {
   safe_browsing::ResourceMap::iterator it = resources_->find(url.spec());
   if (it != resources_->end()) {
     return it->second.get();
@@ -119,7 +119,7 @@
   // Set the response headers and body to the right resource, which
   // might not be the same as the one we asked for.
   // For redirects, resources_it_->first != url.spec().
-  ClientMalwareReportRequest::Resource* resource =
+  ClientSafeBrowsingReportRequest::Resource* resource =
       GetResource(source->GetURL());
   if (!resource) {
     DVLOG(1) << "Cannot find resource for url:" << source->GetURL();
@@ -135,7 +135,7 @@
 }
 
 void ThreatDetailsCacheCollector::ReadResponse(
-    ClientMalwareReportRequest::Resource* pb_resource,
+    ClientSafeBrowsingReportRequest::Resource* pb_resource,
     const net::URLFetcher* source) {
   DVLOG(1) << "ReadResponse";
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -145,13 +145,13 @@
     return;
   }
 
-  ClientMalwareReportRequest::HTTPResponse* pb_response =
+  ClientSafeBrowsingReportRequest::HTTPResponse* pb_response =
       pb_resource->mutable_response();
   pb_response->mutable_firstline()->set_code(headers->response_code());
   void* iter = NULL;
   std::string name, value;
   while (headers->EnumerateHeaderLines(&iter, &name, &value)) {
-    ClientMalwareReportRequest::HTTPHeader* pb_header =
+    ClientSafeBrowsingReportRequest::HTTPHeader* pb_header =
         pb_response->add_headers();
     pb_header->set_name(name);
     // Strip any Set-Cookie headers.
@@ -168,11 +168,11 @@
 }
 
 void ThreatDetailsCacheCollector::ReadData(
-    ClientMalwareReportRequest::Resource* pb_resource,
+    ClientSafeBrowsingReportRequest::Resource* pb_resource,
     const std::string& data) {
   DVLOG(1) << "ReadData";
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  ClientMalwareReportRequest::HTTPResponse* pb_response =
+  ClientSafeBrowsingReportRequest::HTTPResponse* pb_response =
       pb_resource->mutable_response();
   if (data.size() <= kMaxBodySizeBytes) {  // Only send small bodies for now.
     pb_response->set_body(data);
diff --git a/chrome/browser/safe_browsing/threat_details_cache.h b/chrome/browser/safe_browsing/threat_details_cache.h
index 4176264..e6a2817 100644
--- a/chrome/browser/safe_browsing/threat_details_cache.h
+++ b/chrome/browser/safe_browsing/threat_details_cache.h
@@ -15,7 +15,7 @@
 #include "base/containers/hash_tables.h"
 #include "base/memory/linked_ptr.h"
 #include "base/memory/ref_counted.h"
-#include "chrome/browser/safe_browsing/report.pb.h"
+#include "chrome/common/safe_browsing/csd.pb.h"
 #include "net/base/completion_callback.h"
 #include "net/url_request/url_fetcher_delegate.h"
 
@@ -29,7 +29,7 @@
 // Maps a URL to its Resource.
 typedef base::hash_map<
     std::string,
-    linked_ptr<safe_browsing::ClientMalwareReportRequest::Resource>>
+    linked_ptr<safe_browsing::ClientSafeBrowsingReportRequest::Resource>>
     ResourceMap;
 }
 
@@ -85,7 +85,7 @@
   scoped_ptr<net::URLFetcher> current_fetch_;
 
   // Returns the resource from resources_ that corresponds to |url|
-  safe_browsing::ClientMalwareReportRequest::Resource* GetResource(
+  safe_browsing::ClientSafeBrowsingReportRequest::Resource* GetResource(
       const GURL& url);
 
   // Creates a new URLFetcher and starts it.
@@ -93,12 +93,12 @@
 
   // Read the HTTP response from |source| and add it to |pb_resource|.
   void ReadResponse(
-      safe_browsing::ClientMalwareReportRequest::Resource* pb_resource,
+      safe_browsing::ClientSafeBrowsingReportRequest::Resource* pb_resource,
       const net::URLFetcher* source);
 
   // Read the body |data| and add it to |pb_resource|.
   void ReadData(
-      safe_browsing::ClientMalwareReportRequest::Resource* pb_resource,
+      safe_browsing::ClientSafeBrowsingReportRequest::Resource* pb_resource,
       const std::string& data);
 
   // Called when we are done.
diff --git a/chrome/browser/safe_browsing/threat_details_unittest.cc b/chrome/browser/safe_browsing/threat_details_unittest.cc
index f537c5c9..a6b3cc9 100644
--- a/chrome/browser/safe_browsing/threat_details_unittest.cc
+++ b/chrome/browser/safe_browsing/threat_details_unittest.cc
@@ -10,11 +10,11 @@
 #include "base/time/time.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/safe_browsing/report.pb.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/safe_browsing/threat_details.h"
 #include "chrome/browser/safe_browsing/threat_details_history.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
+#include "chrome/common/safe_browsing/csd.pb.h"
 #include "chrome/common/safe_browsing/safebrowsing_messages.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
@@ -42,11 +42,11 @@
 static const char* kSecondRedirectURL = "https://redirecttwo.com/with/path";
 static const char* kReferrerURL = "http://www.referrer.com/with/path";
 
-static const char* kMalwareURL = "http://www.malware.com/with/path";
-static const char* kMalwareHeaders =
+static const char* kThreatURL = "http://www.threat.com/with/path";
+static const char* kThreatHeaders =
     "HTTP/1.1 200 OK\n"
     "Content-Type: image/jpeg\n";
-static const char* kMalwareData = "exploit();";
+static const char* kThreatData = "exploit();";
 
 static const char* kLandingURL = "http://www.landingpage.com/with/path";
 static const char* kLandingHeaders =
@@ -55,11 +55,11 @@
     "Content-Length: 1024\n"
     "Set-Cookie: tastycookie\n";  // This header is stripped.
 static const char* kLandingData =
-    "<iframe src='http://www.malware.com/with/path'>";
+    "<iframe src='http://www.threat.com/with/path'>";
 
 using content::BrowserThread;
 using content::WebContents;
-using safe_browsing::ClientMalwareReportRequest;
+using safe_browsing::ClientSafeBrowsingReportRequest;
 
 namespace {
 
@@ -122,7 +122,7 @@
                ->GetBackend(&cache, cb.callback());
   ASSERT_EQ(net::OK, cb.GetResult(rv));
 
-  WriteToEntry(cache, kMalwareURL, kMalwareHeaders, kMalwareData);
+  WriteToEntry(cache, kThreatURL, kThreatHeaders, kThreatData);
   WriteToEntry(cache, kLandingURL, kLandingHeaders, kLandingData);
 }
 
@@ -195,8 +195,8 @@
   }
 
   static bool ResourceLessThan(
-      const ClientMalwareReportRequest::Resource* lhs,
-      const ClientMalwareReportRequest::Resource* rhs) {
+      const ClientSafeBrowsingReportRequest::Resource* lhs,
+      const ClientSafeBrowsingReportRequest::Resource* rhs) {
     return lhs->id() < rhs->id();
   }
 
@@ -221,20 +221,22 @@
 
  protected:
   void InitResource(UnsafeResource* resource,
+                    SBThreatType threat_type,
                     bool is_subresource,
                     const GURL& url) {
     resource->url = url;
     resource->is_subresource = is_subresource;
-    resource->threat_type = SB_THREAT_TYPE_URL_MALWARE;
+    resource->threat_type = threat_type;
     resource->render_process_host_id =
         web_contents()->GetRenderProcessHost()->GetID();
     resource->render_view_id =
         web_contents()->GetRenderViewHost()->GetRoutingID();
   }
 
-  void VerifyResults(const ClientMalwareReportRequest& report_pb,
-                     const ClientMalwareReportRequest& expected_pb) {
-    EXPECT_EQ(expected_pb.malware_url(), report_pb.malware_url());
+  void VerifyResults(const ClientSafeBrowsingReportRequest& report_pb,
+                     const ClientSafeBrowsingReportRequest& expected_pb) {
+    EXPECT_EQ(expected_pb.type(), report_pb.type());
+    EXPECT_EQ(expected_pb.url(), report_pb.url());
     EXPECT_EQ(expected_pb.page_url(), report_pb.page_url());
     EXPECT_EQ(expected_pb.referrer_url(), report_pb.referrer_url());
     EXPECT_EQ(expected_pb.did_proceed(), report_pb.did_proceed());
@@ -245,18 +247,18 @@
 
     ASSERT_EQ(expected_pb.resources_size(), report_pb.resources_size());
     // Sort the resources, to make the test deterministic
-    std::vector<const ClientMalwareReportRequest::Resource*> resources;
+    std::vector<const ClientSafeBrowsingReportRequest::Resource*> resources;
     for (int i = 0; i < report_pb.resources_size(); ++i) {
-      const ClientMalwareReportRequest::Resource& resource =
+      const ClientSafeBrowsingReportRequest::Resource& resource =
           report_pb.resources(i);
       resources.push_back(&resource);
     }
     std::sort(resources.begin(), resources.end(),
               &ThreatDetailsTest::ResourceLessThan);
 
-    std::vector<const ClientMalwareReportRequest::Resource*> expected;
+    std::vector<const ClientSafeBrowsingReportRequest::Resource*> expected;
     for (int i = 0; i < report_pb.resources_size(); ++i) {
-      const ClientMalwareReportRequest::Resource& resource =
+      const ClientSafeBrowsingReportRequest::Resource& resource =
           expected_pb.resources(i);
       expected.push_back(&resource);
     }
@@ -270,8 +272,9 @@
     EXPECT_EQ(expected_pb.complete(), report_pb.complete());
   }
 
-  void VerifyResource(const ClientMalwareReportRequest::Resource* resource,
-                      const ClientMalwareReportRequest::Resource* expected) {
+  void VerifyResource(
+      const ClientSafeBrowsingReportRequest::Resource* resource,
+      const ClientSafeBrowsingReportRequest::Resource* expected) {
     EXPECT_EQ(expected->id(), resource->id());
     EXPECT_EQ(expected->url(), resource->url());
     EXPECT_EQ(expected->parent_id(), resource->parent_id());
@@ -322,8 +325,8 @@
   scoped_refptr<MockSafeBrowsingUIManager> ui_manager_;
 };
 
-// Tests creating a simple malware report.
-TEST_F(ThreatDetailsTest, MalwareSubResource) {
+// Tests creating a simple threat report of a malware URL.
+TEST_F(ThreatDetailsTest, ThreatSubResource) {
   // Start a load.
   controller().LoadURL(
       GURL(kLandingURL),
@@ -331,7 +334,7 @@
       ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_URL_MALWARE, true, GURL(kThreatURL));
 
   scoped_refptr<ThreatDetailsWrap> report =
       new ThreatDetailsWrap(ui_manager_.get(), web_contents(), resource, NULL);
@@ -339,11 +342,12 @@
   std::string serialized = WaitForSerializedReport(
       report.get(), true /* did_proceed*/, 1 /* num_visit */);
 
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::URL_MALWARE);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   // Note that the referrer policy is not actually enacted here, since that's
   // done in Blink.
@@ -351,12 +355,13 @@
   expected.set_did_proceed(true);
   expected.set_repeat_visit(true);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
   pb_resource = expected.add_resources();
   pb_resource->set_id(1);
-  pb_resource->set_url(kMalwareURL);
+  pb_resource->set_url(kThreatURL);
   pb_resource = expected.add_resources();
   pb_resource->set_id(2);
   pb_resource->set_url(kReferrerURL);
@@ -364,14 +369,14 @@
   VerifyResults(actual, expected);
 }
 
-// Tests creating a simple malware report where the subresource has a
-// different original_url.
-TEST_F(ThreatDetailsTest, MalwareSubResourceWithOriginalUrl) {
+// Tests creating a simple threat report of a phishing page where the
+// subresource has a different original_url.
+TEST_F(ThreatDetailsTest, ThreatSubResourceWithOriginalUrl) {
   controller().LoadURL(GURL(kLandingURL), content::Referrer(),
                        ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_URL_PHISHING, true, GURL(kThreatURL));
   resource.original_url = GURL(kOriginalLandingURL);
 
   scoped_refptr<ThreatDetailsWrap> report =
@@ -380,17 +385,19 @@
   std::string serialized = WaitForSerializedReport(
       report.get(), false /* did_proceed*/, 1 /* num_visit */);
 
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::URL_PHISHING);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   expected.set_referrer_url("");
   expected.set_did_proceed(false);
   expected.set_repeat_visit(true);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
 
@@ -400,33 +407,33 @@
 
   pb_resource = expected.add_resources();
   pb_resource->set_id(2);
-  pb_resource->set_url(kMalwareURL);
-  // The Resource for kMalwareUrl should have the Resource for
+  pb_resource->set_url(kThreatURL);
+  // The Resource for kThreatURL should have the Resource for
   // kOriginalLandingURL (with id 1) as parent.
   pb_resource->set_parent_id(1);
 
   VerifyResults(actual, expected);
 }
 
-// Tests creating a malware report with data from the renderer.
-TEST_F(ThreatDetailsTest, MalwareDOMDetails) {
+// Tests creating a threat report of a UwS page with data from the renderer.
+TEST_F(ThreatDetailsTest, ThreatDOMDetails) {
   controller().LoadURL(GURL(kLandingURL), content::Referrer(),
                        ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_URL_UNWANTED, true, GURL(kThreatURL));
 
   scoped_refptr<ThreatDetailsWrap> report =
       new ThreatDetailsWrap(ui_manager_.get(), web_contents(), resource, NULL);
 
   // Send a message from the DOM, with 2 nodes, a parent and a child.
-  std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
-  SafeBrowsingHostMsg_MalwareDOMDetails_Node child_node;
+  std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
+  SafeBrowsingHostMsg_ThreatDOMDetails_Node child_node;
   child_node.url = GURL(kDOMChildURL);
   child_node.tag_name = "iframe";
   child_node.parent = GURL(kDOMParentURL);
   params.push_back(child_node);
-  SafeBrowsingHostMsg_MalwareDOMDetails_Node parent_node;
+  SafeBrowsingHostMsg_ThreatDOMDetails_Node parent_node;
   parent_node.url = GURL(kDOMParentURL);
   parent_node.children.push_back(GURL(kDOMChildURL));
   params.push_back(parent_node);
@@ -434,23 +441,25 @@
 
   std::string serialized = WaitForSerializedReport(
       report.get(), false /* did_proceed*/, 0 /* num_visit */);
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::URL_UNWANTED);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   expected.set_referrer_url("");
   expected.set_did_proceed(false);
   expected.set_repeat_visit(false);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
 
   pb_resource = expected.add_resources();
   pb_resource->set_id(1);
-  pb_resource->set_url(kMalwareURL);
+  pb_resource->set_url(kThreatURL);
 
   pb_resource = expected.add_resources();
   pb_resource->set_id(2);
@@ -466,37 +475,39 @@
   VerifyResults(actual, expected);
 }
 
-// Tests creating a malware report where there are redirect urls to an unsafe
-// resource url
-TEST_F(ThreatDetailsTest, MalwareWithRedirectUrl) {
+// Tests creating a threat report of a malware page where there are redirect
+// urls to an unsafe resource url.
+TEST_F(ThreatDetailsTest, ThreatWithRedirectUrl) {
   controller().LoadURL(GURL(kLandingURL), content::Referrer(),
                        ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_URL_MALWARE, true, GURL(kThreatURL));
   resource.original_url = GURL(kOriginalLandingURL);
 
   // add some redirect urls
   resource.redirect_urls.push_back(GURL(kFirstRedirectURL));
   resource.redirect_urls.push_back(GURL(kSecondRedirectURL));
-  resource.redirect_urls.push_back(GURL(kMalwareURL));
+  resource.redirect_urls.push_back(GURL(kThreatURL));
 
   scoped_refptr<ThreatDetailsWrap> report =
       new ThreatDetailsWrap(ui_manager_.get(), web_contents(), resource, NULL);
 
   std::string serialized = WaitForSerializedReport(
       report.get(), true /* did_proceed*/, 0 /* num_visit */);
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::URL_MALWARE);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   expected.set_referrer_url("");
   expected.set_did_proceed(true);
   expected.set_repeat_visit(false);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
 
@@ -506,7 +517,7 @@
 
   pb_resource = expected.add_resources();
   pb_resource->set_id(2);
-  pb_resource->set_url(kMalwareURL);
+  pb_resource->set_url(kThreatURL);
   pb_resource->set_parent_id(4);
 
   pb_resource = expected.add_resources();
@@ -528,7 +539,8 @@
                        ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL, true,
+               GURL(kThreatURL));
 
   scoped_refptr<ThreatDetailsWrap> report =
       new ThreatDetailsWrap(ui_manager_.get(), web_contents(), resource,
@@ -540,7 +552,7 @@
                  make_scoped_refptr(profile()->GetRequestContext())));
 
   // The cache collection starts after the IPC from the DOM is fired.
-  std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+  std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
   report->OnReceivedThreatDOMDetails(params);
 
   // Let the cache callbacks complete.
@@ -549,22 +561,24 @@
   DVLOG(1) << "Getting serialized report";
   std::string serialized = WaitForSerializedReport(
       report.get(), true /* did_proceed*/, -1 /* num_visit */);
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::CLIENT_SIDE_PHISHING_URL);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   expected.set_referrer_url("");
   expected.set_did_proceed(true);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
-  safe_browsing::ClientMalwareReportRequest::HTTPResponse* pb_response =
+  safe_browsing::ClientSafeBrowsingReportRequest::HTTPResponse* pb_response =
       pb_resource->mutable_response();
   pb_response->mutable_firstline()->set_code(200);
-  safe_browsing::ClientMalwareReportRequest::HTTPHeader* pb_header =
+  safe_browsing::ClientSafeBrowsingReportRequest::HTTPHeader* pb_header =
       pb_response->add_headers();
   pb_header->set_name("Content-Type");
   pb_header->set_value("text/html");
@@ -575,21 +589,23 @@
   pb_header->set_name("Set-Cookie");
   pb_header->set_value("");  // The cookie is dropped.
   pb_response->set_body(kLandingData);
-  pb_response->set_bodylength(47);
-  pb_response->set_bodydigest("5abb4e63d806ec2c16a40b2699700554");
+  std::string landing_data(kLandingData);
+  pb_response->set_bodylength(landing_data.size());
+  pb_response->set_bodydigest(base::MD5String(landing_data));
   pb_response->set_remote_ip("1.2.3.4:80");
 
   pb_resource = expected.add_resources();
   pb_resource->set_id(1);
-  pb_resource->set_url(kMalwareURL);
+  pb_resource->set_url(kThreatURL);
   pb_response = pb_resource->mutable_response();
   pb_response->mutable_firstline()->set_code(200);
   pb_header = pb_response->add_headers();
   pb_header->set_name("Content-Type");
   pb_header->set_value("image/jpeg");
-  pb_response->set_body(kMalwareData);
-  pb_response->set_bodylength(10);
-  pb_response->set_bodydigest("581373551c43d4cf33bfb3b26838ff95");
+  pb_response->set_body(kThreatData);
+  std::string threat_data(kThreatData);
+  pb_response->set_bodylength(threat_data.size());
+  pb_response->set_bodydigest(base::MD5String(threat_data));
   pb_response->set_remote_ip("1.2.3.4:80");
   expected.set_complete(true);
 
@@ -602,7 +618,8 @@
                        ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL, true,
+               GURL(kThreatURL));
 
   scoped_refptr<ThreatDetailsWrap> report =
       new ThreatDetailsWrap(ui_manager_.get(), web_contents(), resource,
@@ -611,7 +628,7 @@
   // No call to FillCache
 
   // The cache collection starts after the IPC from the DOM is fired.
-  std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+  std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
   report->OnReceivedThreatDOMDetails(params);
 
   // Let the cache callbacks complete.
@@ -620,21 +637,23 @@
   DVLOG(1) << "Getting serialized report";
   std::string serialized = WaitForSerializedReport(
       report.get(), false /* did_proceed*/, -1 /* num_visit */);
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::CLIENT_SIDE_MALWARE_URL);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   expected.set_referrer_url("");
   expected.set_did_proceed(false);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
   pb_resource = expected.add_resources();
   pb_resource->set_id(1);
-  pb_resource->set_url(kMalwareURL);
+  pb_resource->set_url(kThreatURL);
   expected.set_complete(true);
 
   VerifyResults(actual, expected);
@@ -644,8 +663,8 @@
 TEST_F(ThreatDetailsTest, HistoryServiceUrls) {
   // Add content to history service.
   // There are two redirect urls before reacing malware url:
-  // kFirstRedirectURL -> kSecondRedirectURL -> kMalwareURL
-  GURL baseurl(kMalwareURL);
+  // kFirstRedirectURL -> kSecondRedirectURL -> kThreatURL
+  GURL baseurl(kThreatURL);
   history::RedirectList redirects;
   redirects.push_back(GURL(kFirstRedirectURL));
   redirects.push_back(GURL(kSecondRedirectURL));
@@ -657,12 +676,12 @@
                        ui::PAGE_TRANSITION_TYPED, std::string());
 
   UnsafeResource resource;
-  InitResource(&resource, true, GURL(kMalwareURL));
+  InitResource(&resource, SB_THREAT_TYPE_URL_MALWARE, true, GURL(kThreatURL));
   scoped_refptr<ThreatDetailsWrap> report =
       new ThreatDetailsWrap(ui_manager_.get(), web_contents(), resource, NULL);
 
   // The redirects collection starts after the IPC from the DOM is fired.
-  std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+  std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
   report->OnReceivedThreatDOMDetails(params);
 
   // Let the redirects callbacks complete.
@@ -670,23 +689,25 @@
 
   std::string serialized = WaitForSerializedReport(
       report.get(), true /* did_proceed*/, 1 /* num_visit */);
-  ClientMalwareReportRequest actual;
+  ClientSafeBrowsingReportRequest actual;
   actual.ParseFromString(serialized);
 
-  ClientMalwareReportRequest expected;
-  expected.set_malware_url(kMalwareURL);
+  ClientSafeBrowsingReportRequest expected;
+  expected.set_type(ClientSafeBrowsingReportRequest::URL_MALWARE);
+  expected.set_url(kThreatURL);
   expected.set_page_url(kLandingURL);
   expected.set_referrer_url("");
   expected.set_did_proceed(true);
   expected.set_repeat_visit(true);
 
-  ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources();
+  ClientSafeBrowsingReportRequest::Resource* pb_resource =
+      expected.add_resources();
   pb_resource->set_id(0);
   pb_resource->set_url(kLandingURL);
   pb_resource = expected.add_resources();
   pb_resource->set_id(1);
   pb_resource->set_parent_id(2);
-  pb_resource->set_url(kMalwareURL);
+  pb_resource->set_url(kThreatURL);
   pb_resource = expected.add_resources();
   pb_resource->set_id(2);
   pb_resource->set_parent_id(3);
diff --git a/chrome/browser/tracing/background_tracing_field_trial.cc b/chrome/browser/tracing/background_tracing_field_trial.cc
index fbfa2472..ebed2d0 100644
--- a/chrome/browser/tracing/background_tracing_field_trial.cc
+++ b/chrome/browser/tracing/background_tracing_field_trial.cc
@@ -37,7 +37,7 @@
 
 void UploadCallback(const std::string& upload_url,
                     const scoped_refptr<base::RefCountedString>& file_contents,
-                    scoped_ptr<base::DictionaryValue> metadata,
+                    scoped_ptr<const base::DictionaryValue> metadata,
                     base::Closure callback) {
   TraceCrashServiceUploader* uploader = new TraceCrashServiceUploader(
       g_browser_process->system_request_context());
diff --git a/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc b/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc
index 828b0c36..a433959 100644
--- a/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc
+++ b/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc
@@ -84,7 +84,7 @@
 
  private:
   void OnUpload(const scoped_refptr<base::RefCountedString>& file_contents,
-                scoped_ptr<base::DictionaryValue> metadata,
+                scoped_ptr<const base::DictionaryValue> metadata,
                 base::Callback<void()> done_callback) {
     receive_count_ += 1;
 
diff --git a/chrome/browser/tracing/crash_service_uploader.cc b/chrome/browser/tracing/crash_service_uploader.cc
index 1c52834..d34249e 100644
--- a/chrome/browser/tracing/crash_service_uploader.cc
+++ b/chrome/browser/tracing/crash_service_uploader.cc
@@ -107,7 +107,7 @@
 void TraceCrashServiceUploader::DoUpload(
     const std::string& file_contents,
     UploadMode upload_mode,
-    scoped_ptr<base::DictionaryValue> metadata,
+    scoped_ptr<const base::DictionaryValue> metadata,
     const UploadProgressCallback& progress_callback,
     const UploadDoneCallback& done_callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -123,7 +123,7 @@
     const std::string& file_contents,
     UploadMode upload_mode,
     const std::string& upload_url,
-    scoped_ptr<base::DictionaryValue> metadata,
+    scoped_ptr<const base::DictionaryValue> metadata,
     const UploadProgressCallback& progress_callback,
     const UploadDoneCallback& done_callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
@@ -209,7 +209,7 @@
 void TraceCrashServiceUploader::SetupMultipart(
     const std::string& product,
     const std::string& version,
-    scoped_ptr<base::DictionaryValue> metadata,
+    scoped_ptr<const base::DictionaryValue> metadata,
     const std::string& trace_filename,
     const std::string& trace_contents,
     std::string* post_data) {
diff --git a/chrome/browser/tracing/crash_service_uploader.h b/chrome/browser/tracing/crash_service_uploader.h
index eddce8d..369e8b0 100644
--- a/chrome/browser/tracing/crash_service_uploader.h
+++ b/chrome/browser/tracing/crash_service_uploader.h
@@ -40,7 +40,7 @@
   // content::TraceUploader
   void DoUpload(const std::string& file_contents,
                 UploadMode upload_mode,
-                scoped_ptr<base::DictionaryValue> metadata,
+                scoped_ptr<const base::DictionaryValue> metadata,
                 const UploadProgressCallback& progress_callback,
                 const UploadDoneCallback& done_callback) override;
 
@@ -48,14 +48,14 @@
   void DoUploadOnFileThread(const std::string& file_contents,
                             UploadMode upload_mode,
                             const std::string& upload_url,
-                            scoped_ptr<base::DictionaryValue> metadata,
+                            scoped_ptr<const base::DictionaryValue> metadata,
                             const UploadProgressCallback& progress_callback,
                             const UploadDoneCallback& done_callback);
   // Sets up a multipart body to be uploaded. The body is produced according
   // to RFC 2046.
   void SetupMultipart(const std::string& product,
                       const std::string& version,
-                      scoped_ptr<base::DictionaryValue> metadata,
+                      scoped_ptr<const base::DictionaryValue> metadata,
                       const std::string& trace_filename,
                       const std::string& trace_contents,
                       std::string* post_data);
diff --git a/chrome/browser/tracing/navigation_tracing.cc b/chrome/browser/tracing/navigation_tracing.cc
index 5655b050..aee8615 100644
--- a/chrome/browser/tracing/navigation_tracing.cc
+++ b/chrome/browser/tracing/navigation_tracing.cc
@@ -34,7 +34,7 @@
 }
 
 void UploadCallback(const scoped_refptr<base::RefCountedString>& file_contents,
-                    scoped_ptr<base::DictionaryValue> metadata,
+                    scoped_ptr<const base::DictionaryValue> metadata,
                     base::Closure callback) {
   TraceCrashServiceUploader* uploader = new TraceCrashServiceUploader(
       g_browser_process->system_request_context());
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index fd5be708..28cf5e6 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -176,7 +176,6 @@
     deps += [
       "//chrome/browser/safe_browsing:chunk_proto",
       "//chrome/common/safe_browsing:proto",
-      "//chrome/browser/safe_browsing:report_proto",
     ]
   }
 
@@ -250,6 +249,12 @@
                              ".",
                              "//chrome")
     }
+    if (is_android) {
+      sources +=
+          rebase_path(gypi_values.chrome_browser_ui_views_android_sources,
+                      ".",
+                      "//chrome")
+    }
   } else {
     # !toolkit_views
     if (!is_ios) {
diff --git a/chrome/browser/ui/android/content_settings/popup_blocked_infobar_delegate.cc b/chrome/browser/ui/android/content_settings/popup_blocked_infobar_delegate.cc
index b502d3a..4d058f9 100644
--- a/chrome/browser/ui/android/content_settings/popup_blocked_infobar_delegate.cc
+++ b/chrome/browser/ui/android/content_settings/popup_blocked_infobar_delegate.cc
@@ -92,8 +92,8 @@
   DCHECK(can_show_popups_);
 
   // Create exceptions.
-  map_->AddExceptionForURL(
-      url_, url_, CONTENT_SETTINGS_TYPE_POPUPS, CONTENT_SETTING_ALLOW);
+  map_->SetNarrowestContentSetting(url_, url_, CONTENT_SETTINGS_TYPE_POPUPS,
+                                   CONTENT_SETTING_ALLOW);
 
   // Launch popups.
   content::WebContents* web_contents =
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc
index 54fea49..8001fae 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -34,6 +34,7 @@
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/display/display_configuration_observer.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "components/user_manager/user.h"
@@ -193,6 +194,18 @@
       IDR_BLUETOOTH_KEYBOARD);
 }
 
+void ChromeShellDelegate::ToggleTouchpad() {
+#if defined(OS_CHROMEOS)
+  chromeos::system::InputDeviceSettings::Get()->ToggleTouchpad();
+#endif  // defined(OS_CHROMEOS)
+}
+
+void ChromeShellDelegate::ToggleTouchscreen() {
+#if defined(OS_CHROMEOS)
+  chromeos::system::InputDeviceSettings::Get()->ToggleTouchscreen();
+#endif  // defined(OS_CHROMEOS)
+}
+
 keyboard::KeyboardUI* ChromeShellDelegate::CreateKeyboardUI() {
   return new ChromeKeyboardUI(ProfileManager::GetActiveUserProfile());
 }
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h
index e069b716..c2ed9ea 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.h
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.h
@@ -79,6 +79,8 @@
   base::string16 GetProductName() const override;
   void OpenKeyboardShortcutHelpPage() const override;
   gfx::Image GetDeprecatedAcceleratorImage() const override;
+  void ToggleTouchpad() override;
+  void ToggleTouchscreen() override;
 
   // content::NotificationObserver override:
   void Observe(int type,
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 29e4088e..da8bfb9 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -164,7 +164,7 @@
 #include "components/search/search.h"
 #include "components/sessions/core/session_types.h"
 #include "components/sessions/core/tab_restore_service.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "components/translate/core/browser/language_state.h"
 #include "components/ui/zoom/zoom_controller.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.h b/chrome/browser/ui/cocoa/browser_window_controller.h
index e438e18b..3ba66c2 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.h
+++ b/chrome/browser/ui/cocoa/browser_window_controller.h
@@ -153,6 +153,11 @@
   // primary screen.
   BOOL enteringAppKitFullscreenOnPrimaryScreen_;
 
+  // This flag is set to true when |customWindowsToEnterFullScreenForWindow:|
+  // and |customWindowsToExitFullScreenForWindow:| are called and did not
+  // return nil.
+  BOOL isUsingCustomAnimation_;
+
   // The size of the original (non-fullscreen) window.  This is saved just
   // before entering fullscreen mode and is only valid when |-isFullscreen|
   // returns YES.
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
index 0fdcfa3..45181c7 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
@@ -694,7 +694,7 @@
   // in startCustomAnimationToEnterFullScreenWithDuration. In order to prevent
   // multiple resizing messages from being sent to the renderer, we should call
   // adjustUIForEnteringFullscreen after the layout gets resized.
-  if ([self shouldUseCustomAppKitFullscreenTransition:YES])
+  if (isUsingCustomAnimation_)
     blockLayoutSubviews_ = YES;
   else
     [self adjustUIForEnteringFullscreen];
@@ -748,6 +748,7 @@
   enteringAppKitFullscreen_ = NO;
   enteringImmersiveFullscreen_ = NO;
   enteringPresentationMode_ = NO;
+  isUsingCustomAnimation_ = NO;
 
   [self showFullscreenExitBubbleIfNecessary];
   browser_->WindowFullscreenStateChanged();
@@ -761,7 +762,7 @@
   // Like windowWillEnterFullScreen, if we use custom animations,
   // adjustUIForExitingFullscreen should be called after the layout resizes in
   // startCustomAnimationToExitFullScreenWithDuration.
-  if ([self shouldUseCustomAppKitFullscreenTransition:NO])
+  if (isUsingCustomAnimation_)
     blockLayoutSubviews_ = YES;
   else
     [self adjustUIForExitingFullscreen];
@@ -776,6 +777,7 @@
   browser_->WindowFullscreenStateChanged();
 
   exitingAppKitFullscreen_ = NO;
+  isUsingCustomAnimation_ = NO;
   fullscreenTransition_.reset();
 
   blockLayoutSubviews_ = NO;
@@ -786,6 +788,7 @@
   enteringAppKitFullscreen_ = NO;
   fullscreenTransition_.reset();
   blockLayoutSubviews_ = NO;
+  isUsingCustomAnimation_ = NO;
   [self adjustUIForExitingFullscreenAndStopOmniboxSliding];
 }
 
@@ -793,6 +796,7 @@
   [self deregisterForContentViewResizeNotifications];
   exitingAppKitFullscreen_ = NO;
   fullscreenTransition_.reset();
+  isUsingCustomAnimation_ = NO;
   blockLayoutSubviews_ = NO;
   // Force a relayout to try and get the window back into a reasonable state.
   [self layoutSubviews];
@@ -1144,7 +1148,11 @@
       base::mac::ObjCCast<FramedBrowserWindow>([self window]);
   fullscreenTransition_.reset([[BrowserWindowFullscreenTransition alloc]
       initEnterWithWindow:framedBrowserWindow]);
-  return [fullscreenTransition_ customWindowsForFullScreenTransition];
+
+  NSArray* customWindows =
+      [fullscreenTransition_ customWindowsForFullScreenTransition];
+  isUsingCustomAnimation_ = !customWindows;
+  return customWindows;
 }
 
 - (NSArray*)customWindowsToExitFullScreenForWindow:(NSWindow*)window {
@@ -1159,7 +1167,10 @@
       initExitWithWindow:framedBrowserWindow
                    frame:savedRegularWindowFrame_]);
 
-  return [fullscreenTransition_ customWindowsForFullScreenTransition];
+  NSArray* customWindows =
+      [fullscreenTransition_ customWindowsForFullScreenTransition];
+  isUsingCustomAnimation_ = !customWindows;
+  return customWindows;
 }
 
 - (void)window:(NSWindow*)window
diff --git a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
index eeab29d..802a42df 100644
--- a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
+++ b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm
@@ -267,10 +267,7 @@
     new ContentSettingBubbleWebContentsObserverBridge(webContents, self));
 
   ContentSettingsType settingsType = model->content_type();
-  DCHECK(ContainsKey(ContentSettingBubbleModel::GetSupportedBubbleTypes(),
-                     settingsType));
-  DCHECK_EQ(ContentSettingBubbleModel::GetSupportedBubbleTypes().size(),
-            arraysize(kNibPaths));
+
   NSString* nibPath = @"";
   for (const ContentTypeToNibPath& type_to_path : kNibPaths) {
     if (settingsType == type_to_path.type) {
diff --git a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_browsertest.mm
new file mode 100644
index 0000000..7a624aa
--- /dev/null
+++ b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_browsertest.mm
@@ -0,0 +1,113 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/mac/scoped_nsautorelease_pool.h"
+#include "base/mac/scoped_nsobject.h"
+#include "chrome/browser/content_settings/tab_specific_content_settings.h"
+#include "chrome/browser/media/media_capture_devices_dispatcher.h"
+#include "chrome/browser/ui/browser.h"
+#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
+#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
+#include "chrome/browser/ui/content_settings/content_setting_image_model.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/common/media_stream_request.h"
+#include "testing/gtest_mac.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+class ContentSettingBubbleControllerTest : public InProcessBrowserTest {
+ protected:
+  ContentSettingBubbleControllerTest() {}
+
+  content::WebContents* web_contents() {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
+  Profile* profile() {
+    return browser()->profile();
+  }
+
+  // Helper function to create the bubble controller.
+  ContentSettingBubbleController* CreateBubbleController(
+      ContentSettingBubbleModel* bubble);
+
+  base::scoped_nsobject<NSWindow> parent_;
+
+ private:
+  base::mac::ScopedNSAutoreleasePool pool_;
+};
+
+ContentSettingBubbleController*
+ContentSettingBubbleControllerTest::CreateBubbleController(
+    ContentSettingBubbleModel* bubble) {
+  parent_.reset([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 800, 600)
+                                            styleMask:NSBorderlessWindowMask
+                                              backing:NSBackingStoreBuffered
+                                                defer:NO]);
+  [parent_ setReleasedWhenClosed:NO];
+  [parent_ orderFront:nil];
+
+  ContentSettingBubbleController* controller = [ContentSettingBubbleController
+      showForModel:bubble
+       webContents:web_contents()
+      parentWindow:parent_
+        anchoredAt:NSMakePoint(50, 20)];
+
+  EXPECT_TRUE(controller);
+  EXPECT_TRUE([[controller window] isVisible]);
+
+  return controller;
+}
+
+// Check that the bubble doesn't crash or leak for any image model.
+IN_PROC_BROWSER_TEST_F(ContentSettingBubbleControllerTest, Init) {
+  TabSpecificContentSettings::FromWebContents(web_contents())->
+      BlockAllContentForTesting();
+  ScopedVector<ContentSettingImageModel> models =
+      ContentSettingImageModel::GenerateContentSettingImageModels();
+  for (ContentSettingImageModel* model : models.get()) {
+    ContentSettingBubbleModel* bubble =
+        model->CreateBubbleModel(nullptr, web_contents(), profile());
+    ContentSettingBubbleController* controller = CreateBubbleController(bubble);
+    // No bubble except the one for media should have media menus.
+    if (bubble->content_type() != CONTENT_SETTINGS_TYPE_MEDIASTREAM)
+      EXPECT_EQ(0u, [controller mediaMenus]->size());
+    [parent_ close];
+  }
+}
+
+// The media bubble is specific in that in serves two content setting types.
+// Test that it works too.
+IN_PROC_BROWSER_TEST_F(ContentSettingBubbleControllerTest, MediaStreamBubble) {
+  TabSpecificContentSettings::FromWebContents(web_contents())->
+      BlockAllContentForTesting();
+  MediaCaptureDevicesDispatcher::GetInstance()->
+      DisableDeviceEnumerationForTesting();
+  ContentSettingBubbleController* controller = CreateBubbleController(
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
+  content_setting_bubble::MediaMenuPartsMap* mediaMenus =
+      [controller mediaMenus];
+  EXPECT_EQ(2u, mediaMenus->size());
+  NSString* title = l10n_util::GetNSString(IDS_MEDIA_MENU_NO_DEVICE_TITLE);
+  for (content_setting_bubble::MediaMenuPartsMap::const_iterator i =
+       mediaMenus->begin(); i != mediaMenus->end(); ++i) {
+    EXPECT_TRUE((content::MEDIA_DEVICE_AUDIO_CAPTURE == i->second->type) ||
+                (content::MEDIA_DEVICE_VIDEO_CAPTURE == i->second->type));
+    EXPECT_EQ(0, [i->first numberOfItems]);
+    EXPECT_NSEQ(title, [i->first title]);
+    EXPECT_FALSE([i->first isEnabled]);
+  }
+
+ [parent_ close];
+}
+
+}  // namespace
diff --git a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_unittest.mm b/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_unittest.mm
deleted file mode 100644
index 078f454..0000000
--- a/chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_unittest.mm
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "chrome/browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.h"
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsautorelease_pool.h"
-#include "base/mac/scoped_nsobject.h"
-#include "chrome/browser/chrome_content_browser_client.h"
-#include "chrome/browser/media/media_capture_devices_dispatcher.h"
-#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
-#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
-#include "chrome/common/chrome_content_client.h"
-#include "chrome/grit/generated_resources.h"
-#include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "chrome/test/base/chrome_unit_test_suite.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/common/media_stream_request.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/gtest_mac.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace {
-
-class DummyContentSettingBubbleModel : public ContentSettingBubbleModel {
- public:
-  DummyContentSettingBubbleModel(content::WebContents* web_contents,
-                                 Profile* profile,
-                                 ContentSettingsType content_type)
-      : ContentSettingBubbleModel(web_contents, profile, content_type) {
-    RadioGroup radio_group;
-    radio_group.default_item = 0;
-    radio_group.radio_items.resize(2);
-    set_radio_group(radio_group);
-    MediaMenu micMenu;
-    micMenu.label = "Microphone:";
-    add_media_menu(content::MEDIA_DEVICE_AUDIO_CAPTURE, micMenu);
-    MediaMenu cameraMenu;
-    cameraMenu.label = "Camera:";
-    add_media_menu(content::MEDIA_DEVICE_VIDEO_CAPTURE, cameraMenu);
-  }
-};
-
-class ContentSettingBubbleControllerTest
-    : public ChromeRenderViewHostTestHarness {
- protected:
-  // Helper function to create the bubble controller.
-  ContentSettingBubbleController* CreateBubbleController(
-      ContentSettingsType settingsType);
-
-  void SetUp() override {
-    ChromeUnitTestSuite::InitializeProviders();
-    ChromeUnitTestSuite::InitializeResourceBundle();
-    content_client_.reset(new ChromeContentClient);
-    content::SetContentClient(content_client_.get());
-    browser_content_client_.reset(new ChromeContentBrowserClient());
-    content::SetBrowserClientForTesting(browser_content_client_.get());
-    initializer_.reset(new TestingBrowserProcessInitializer);
-    ChromeRenderViewHostTestHarness::SetUp();
-  }
-
-  scoped_ptr<ChromeContentClient> content_client_;
-  scoped_ptr<ChromeContentBrowserClient> browser_content_client_;
-
-  // This is a unit test running in the browser_tests suite, so we must create
-  // the TestingBrowserProcess manually. Must be first member.
-  scoped_ptr<TestingBrowserProcessInitializer> initializer_;
-
-  base::scoped_nsobject<NSWindow> parent_;
-
- private:
-  base::mac::ScopedNSAutoreleasePool pool_;
-};
-
-ContentSettingBubbleController*
-ContentSettingBubbleControllerTest::CreateBubbleController(
-    ContentSettingsType settingsType) {
-  parent_.reset([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 800, 600)
-                                            styleMask:NSBorderlessWindowMask
-                                              backing:NSBackingStoreBuffered
-                                                defer:NO]);
-  [parent_ setReleasedWhenClosed:NO];
-  [parent_ orderFront:nil];
-
-  ContentSettingBubbleController* controller = [ContentSettingBubbleController
-      showForModel:new DummyContentSettingBubbleModel(web_contents(),
-                                                      profile(),
-                                                      settingsType)
-       webContents:web_contents()
-      parentWindow:parent_
-        anchoredAt:NSMakePoint(50, 20)];
-
-  EXPECT_TRUE(controller);
-  EXPECT_TRUE([[controller window] isVisible]);
-
-  return controller;
-}
-
-// Check that the bubble doesn't crash or leak for any settings type
-TEST_F(ContentSettingBubbleControllerTest, Init) {
-  for (ContentSettingsType type :
-       ContentSettingBubbleModel::GetSupportedBubbleTypes()) {
-    // Media stream is tested in the MediaStreamBubble test below.
-    if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM)
-      continue;
-    ContentSettingBubbleController* controller = CreateBubbleController(type);
-    EXPECT_EQ(0u, [controller mediaMenus]->size());
-    [parent_ close];
-  }
-}
-
-// Check that the bubble works for CONTENT_SETTINGS_TYPE_MEDIASTREAM.
-TEST_F(ContentSettingBubbleControllerTest, MediaStreamBubble) {
-  MediaCaptureDevicesDispatcher::GetInstance()->
-      DisableDeviceEnumerationForTesting();
-  ContentSettingBubbleController* controller =
-      CreateBubbleController(CONTENT_SETTINGS_TYPE_MEDIASTREAM);
-  content_setting_bubble::MediaMenuPartsMap* mediaMenus =
-      [controller mediaMenus];
-  EXPECT_EQ(2u, mediaMenus->size());
-  NSString* title = l10n_util::GetNSString(IDS_MEDIA_MENU_NO_DEVICE_TITLE);
-  for (content_setting_bubble::MediaMenuPartsMap::const_iterator i =
-       mediaMenus->begin(); i != mediaMenus->end(); ++i) {
-    EXPECT_TRUE((content::MEDIA_DEVICE_AUDIO_CAPTURE == i->second->type) ||
-                (content::MEDIA_DEVICE_VIDEO_CAPTURE == i->second->type));
-    EXPECT_EQ(0, [i->first numberOfItems]);
-    EXPECT_NSEQ(title, [i->first title]);
-    EXPECT_FALSE([i->first isEnabled]);
-  }
-
- [parent_ close];
-}
-
-}  // namespace
diff --git a/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.h b/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.h
index 5782b5c..c6c692d 100644
--- a/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.h
+++ b/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.h
@@ -23,7 +23,8 @@
 
 class ContentSettingDecoration : public ImageDecoration {
  public:
-  ContentSettingDecoration(ContentSettingsType settings_type,
+  // ContentSettingDecoration takes ownership of its model.
+  ContentSettingDecoration(ContentSettingImageModel* model,
                            LocationBarViewMac* owner,
                            Profile* profile);
   ~ContentSettingDecoration() override;
diff --git a/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm b/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm
index f53be88..9acd5a71 100644
--- a/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm
+++ b/chrome/browser/ui/cocoa/location_bar/content_setting_decoration.mm
@@ -157,12 +157,10 @@
 
 
 ContentSettingDecoration::ContentSettingDecoration(
-    ContentSettingsType settings_type,
+    ContentSettingImageModel* model,
     LocationBarViewMac* owner,
     Profile* profile)
-    : content_setting_image_model_(
-          ContentSettingImageModel::CreateContentSettingImageModel(
-              settings_type)),
+    : content_setting_image_model_(model),
       owner_(owner),
       profile_(profile),
       text_width_(0.0) {
@@ -192,15 +190,11 @@
         content_setting_image_model_->explanatory_string_id();
 
     // Check if the animation has already run.
-    TabSpecificContentSettings* content_settings =
-        TabSpecificContentSettings::FromWebContents(web_contents);
-    ContentSettingsType content_type =
-        content_setting_image_model_->get_content_settings_type();
-    bool ran_animation = content_settings->IsBlockageIndicated(content_type);
-
-    if (has_animated_text && !ran_animation && !animation_) {
+    if (has_animated_text &&
+        content_setting_image_model_->ShouldRunAnimation(web_contents) &&
+        !animation_) {
       // Mark the animation as having been run.
-      content_settings->SetBlockageHasBeenIndicated(content_type);
+      content_setting_image_model_->SetAnimationHasRun(web_contents);
       // Start animation, its timer will drive reflow. Note the text is
       // cached so it is not allowed to change during the animation.
       animation_.reset(
@@ -276,10 +270,10 @@
 
   // Open bubble.
   ContentSettingBubbleModel* model =
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+      content_setting_image_model_->CreateBubbleModel(
           browser->content_setting_bubble_model_delegate(),
-          web_contents, profile_,
-          content_setting_image_model_->get_content_settings_type());
+          web_contents,
+          profile_);
   [ContentSettingBubbleController showForModel:model
                                    webContents:web_contents
                                   parentWindow:[field window]
diff --git a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm
index eda3e57..780c1a3f 100644
--- a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm
+++ b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm
@@ -108,11 +108,14 @@
       browser_(browser),
       location_bar_visible_(true),
       weak_ptr_factory_(this) {
-  for (ContentSettingsType type :
-       ContentSettingBubbleModel::GetSupportedBubbleTypes()) {
+  ScopedVector<ContentSettingImageModel> models =
+      ContentSettingImageModel::GenerateContentSettingImageModels();
+  for (ContentSettingImageModel* model : models.get()) {
+    // ContentSettingDecoration takes ownership of its model.
     content_setting_decorations_.push_back(
-        new ContentSettingDecoration(type, this, profile));
+        new ContentSettingDecoration(model, this, profile));
   }
+  models.weak_clear();
 
   edit_bookmarks_enabled_.Init(
       bookmarks::prefs::kEditBookmarksEnabled, profile->GetPrefs(),
diff --git a/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm
index 5d17e1c9..cf0455c 100644
--- a/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm
+++ b/chrome/browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm
@@ -8,6 +8,7 @@
 #include "base/command_line.h"
 #import "base/mac/bundle_locations.h"
 #include "base/strings/sys_string_conversions.h"
+#import "chrome/browser/ui/cocoa/key_equivalent_constants.h"
 #import "chrome/browser/ui/cocoa/media_picker/desktop_media_picker_item.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/grit/generated_resources.h"
@@ -152,6 +153,7 @@
   [shareButton_ setFrameOrigin:origin];
   [shareButton_ setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
   [shareButton_ setTarget:self];
+  [shareButton_ setKeyEquivalent:kKeyEquivalentReturn];
   [shareButton_ setAction:@selector(sharePressed:)];
   [content addSubview:shareButton_];
 
@@ -163,6 +165,7 @@
   [cancelButton_ setFrameOrigin:origin];
   [cancelButton_ setAutoresizingMask:NSViewMinXMargin | NSViewMinYMargin];
   [cancelButton_ setTarget:self];
+  [cancelButton_ setKeyEquivalent:kKeyEquivalentEscape];
   [cancelButton_ setAction:@selector(cancelPressed:)];
   [content addSubview:cancelButton_];
   origin.y += kFramePadding +
diff --git a/chrome/browser/ui/cocoa/simple_message_box_mac.mm b/chrome/browser/ui/cocoa/simple_message_box_mac.mm
index 508b84f..4193a64 100644
--- a/chrome/browser/ui/cocoa/simple_message_box_mac.mm
+++ b/chrome/browser/ui/cocoa/simple_message_box_mac.mm
@@ -9,7 +9,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "chrome/browser/ui/simple_message_box_internal.h"
 #include "chrome/grit/generated_resources.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
 namespace chrome {
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
index 76351bd..44d4580 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/content_settings/chrome_content_settings_utils.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
 #include "chrome/browser/infobars/infobar_service.h"
@@ -57,22 +56,6 @@
 
 const int kAllowButtonIndex = 0;
 
-// static
-const ContentSettingsType kSupportedBubbleTypes[] = {
-    CONTENT_SETTINGS_TYPE_COOKIES,
-    CONTENT_SETTINGS_TYPE_IMAGES,
-    CONTENT_SETTINGS_TYPE_JAVASCRIPT,
-    CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
-    CONTENT_SETTINGS_TYPE_PLUGINS,
-    CONTENT_SETTINGS_TYPE_POPUPS,
-    CONTENT_SETTINGS_TYPE_GEOLOCATION,
-    CONTENT_SETTINGS_TYPE_MIXEDSCRIPT,
-    CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS,
-    CONTENT_SETTINGS_TYPE_MEDIASTREAM,
-    CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
-    CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
-};
-
 // These states must match the order of appearance of the radio buttons
 // in the XIB file for the Mac port.
 enum RPHState {
@@ -256,7 +239,7 @@
 
  private:
   void SetRadioGroup();
-  void AddException(ContentSetting setting);
+  void SetNarrowestContentSetting(ContentSetting setting);
   void OnRadioClicked(int radio_index) override;
 
   ContentSetting block_setting_;
@@ -281,7 +264,7 @@
         selected_item_ == kAllowButtonIndex ?
                           CONTENT_SETTING_ALLOW :
                           block_setting_;
-    AddException(setting);
+    SetNarrowestContentSetting(setting);
   }
 }
 
@@ -414,13 +397,13 @@
   set_radio_group(radio_group);
 }
 
-void ContentSettingSingleRadioGroup::AddException(ContentSetting setting) {
+void ContentSettingSingleRadioGroup::SetNarrowestContentSetting(
+    ContentSetting setting) {
   if (profile()) {
-    HostContentSettingsMapFactory::GetForProfile(profile())->AddExceptionForURL(
-        bubble_content().radio_group.url,
-        bubble_content().radio_group.url,
-        content_type(),
-        setting);
+    HostContentSettingsMapFactory::GetForProfile(profile())
+        ->SetNarrowestContentSetting(bubble_content().radio_group.url,
+                                     bubble_content().radio_group.url,
+                                     content_type(), setting);
   }
 }
 
@@ -587,53 +570,6 @@
   }
 }
 
-// The model of the content settings bubble for media settings.
-class ContentSettingMediaStreamBubbleModel
-    : public ContentSettingTitleAndLinkModel {
- public:
-  ContentSettingMediaStreamBubbleModel(Delegate* delegate,
-                                       WebContents* web_contents,
-                                       Profile* profile);
-
-  ~ContentSettingMediaStreamBubbleModel() override;
-
-  void OnManageLinkClicked() override;
-
- private:
-  // Helper functions to check if this bubble was invoked for microphone,
-  // camera, or both devices.
-  bool MicrophoneAccessed() const;
-  bool CameraAccessed() const;
-
-  void SetTitle();
-  // Sets the data for the radio buttons of the bubble.
-  void SetRadioGroup();
-  // Sets the data for the media menus of the bubble.
-  void SetMediaMenus();
-  // Set the settings management link.
-  void SetManageLink();
-  void SetCustomLink();
-  // Updates the camera and microphone setting with the passed |setting|.
-  void UpdateSettings(ContentSetting setting);
-  // Updates the camera and microphone default device with the passed |type|
-  // and device.
-  void UpdateDefaultDeviceForType(content::MediaStreamType type,
-                                  const std::string& device);
-
-  // ContentSettingBubbleModel implementation.
-  void OnRadioClicked(int radio_index) override;
-  void OnMediaMenuClicked(content::MediaStreamType type,
-                          const std::string& selected_device) override;
-
-  // The index of the selected radio item.
-  int selected_item_;
-  // The content settings that are associated with the individual radio
-  // buttons.
-  ContentSetting radio_item_setting_[2];
-  // The state of the microphone and camera access.
-  TabSpecificContentSettings::MicrophoneCameraState state_;
-};
-
 ContentSettingMediaStreamBubbleModel::ContentSettingMediaStreamBubbleModel(
     Delegate* delegate,
     WebContents* web_contents,
@@ -1283,23 +1219,12 @@
 }
 
 // static
-const std::set<ContentSettingsType>&
-ContentSettingBubbleModel::GetSupportedBubbleTypes() {
-  CR_DEFINE_STATIC_LOCAL(
-      const std::set<ContentSettingsType>, supported_bubble_types,
-      (kSupportedBubbleTypes,
-       kSupportedBubbleTypes + arraysize(kSupportedBubbleTypes)));
-  return supported_bubble_types;
-}
-
-// static
 ContentSettingBubbleModel*
     ContentSettingBubbleModel::CreateContentSettingBubbleModel(
         Delegate* delegate,
         WebContents* web_contents,
         Profile* profile,
         ContentSettingsType content_type) {
-  DCHECK(ContainsKey(GetSupportedBubbleTypes(), content_type));
   if (content_type == CONTENT_SETTINGS_TYPE_COOKIES) {
     return new ContentSettingCookiesBubbleModel(delegate, web_contents,
                                                 profile);
@@ -1332,8 +1257,15 @@
     return new ContentSettingMidiSysExBubbleModel(delegate, web_contents,
                                                   profile);
   }
-  return new ContentSettingSingleRadioGroup(delegate, web_contents, profile,
-                                            content_type);
+  if (content_type == CONTENT_SETTINGS_TYPE_IMAGES ||
+      content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT ||
+      content_type == CONTENT_SETTINGS_TYPE_PPAPI_BROKER ||
+      content_type == CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS) {
+    return new ContentSettingSingleRadioGroup(delegate, web_contents, profile,
+                                              content_type);
+  }
+  NOTREACHED() << "No bubble for the content type " << content_type << ".";
+  return nullptr;
 }
 
 ContentSettingBubbleModel::ContentSettingBubbleModel(
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.h b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
index f6a1a174..2ec8745 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.h
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
@@ -11,6 +11,8 @@
 #include <vector>
 
 #include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/common/custom_handlers/protocol_handler.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_types.h"
@@ -97,9 +99,6 @@
     DISALLOW_COPY_AND_ASSIGN(BubbleContent);
   };
 
-  // Returns a set of the supported bubble types.
-  static const std::set<ContentSettingsType>& GetSupportedBubbleTypes();
-
   static ContentSettingBubbleModel* CreateContentSettingBubbleModel(
       Delegate* delegate,
       content::WebContents* web_contents,
@@ -130,6 +129,11 @@
   virtual void OnDoneClicked() {}
 
  protected:
+  // Create a bubble tied to a certain |content_type|. Note that not all content
+  // settings types have a bubble, and not all bubbles are tied to a single
+  // content setting.
+  // TODO(msramek): Generalize the bubble so that it does not reference content
+  // settings, and subclass those that need it.
   ContentSettingBubbleModel(
       content::WebContents* web_contents,
       Profile* profile,
@@ -208,6 +212,8 @@
   void OnManageLinkClicked() override;
   void OnLearnMoreLinkClicked() override;
   Delegate* delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingTitleAndLinkModel);
 };
 
 // RPH stands for Register Protocol Handler.
@@ -231,6 +237,65 @@
   ProtocolHandlerRegistry* registry_;
   ProtocolHandler pending_handler_;
   ProtocolHandler previous_handler_;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingRPHBubbleModel);
+};
+
+// The model of the content settings bubble for media settings.
+class ContentSettingMediaStreamBubbleModel
+    : public ContentSettingTitleAndLinkModel {
+ public:
+  ContentSettingMediaStreamBubbleModel(Delegate* delegate,
+                                       content::WebContents* web_contents,
+                                       Profile* profile);
+
+  ~ContentSettingMediaStreamBubbleModel() override;
+
+  // ContentSettingTitleAndLinkModel:
+  void OnManageLinkClicked() override;
+
+ private:
+  // Helper functions to check if this bubble was invoked for microphone,
+  // camera, or both devices.
+  bool MicrophoneAccessed() const;
+  bool CameraAccessed() const;
+
+  void SetTitle();
+
+  // Sets the data for the radio buttons of the bubble.
+  void SetRadioGroup();
+
+  // Sets the data for the media menus of the bubble.
+  void SetMediaMenus();
+
+  // Sets the settings management link.
+  void SetManageLink();
+
+  // Sets the string that suggests reloading after the settings were changed.
+  void SetCustomLink();
+
+  // Updates the camera and microphone setting with the passed |setting|.
+  void UpdateSettings(ContentSetting setting);
+
+  // Updates the camera and microphone default device with the passed |type|
+  // and device.
+  void UpdateDefaultDeviceForType(content::MediaStreamType type,
+                                  const std::string& device);
+
+  // ContentSettingBubbleModel implementation.
+  void OnRadioClicked(int radio_index) override;
+  void OnMediaMenuClicked(content::MediaStreamType type,
+                          const std::string& selected_device) override;
+
+  // The index of the selected radio item.
+  int selected_item_;
+  // The content settings that are associated with the individual radio
+  // buttons.
+  ContentSetting radio_item_setting_[2];
+  // The state of the microphone and camera access.
+  TabSpecificContentSettings::MicrophoneCameraState state_;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingMediaStreamBubbleModel);
 };
 
 #endif  // CHROME_BROWSER_UI_CONTENT_SETTINGS_CONTENT_SETTING_BUBBLE_MODEL_H_
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_browsertest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_browsertest.cc
index ea1fa8d..4b8b84e4 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model_browsertest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_browsertest.cc
@@ -107,11 +107,10 @@
             original_tab->GetLastCommittedURL(),
             state, std::string(), std::string(), std::string(), std::string());
     scoped_ptr<ContentSettingBubbleModel> bubble(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+        new ContentSettingMediaStreamBubbleModel(
             browser()->content_setting_bubble_model_delegate(),
             original_tab,
-            browser()->profile(),
-            CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+            browser()->profile()));
 
     // Click the management link, which opens in a new tab or window.
     // Wait until it loads.
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
index 3f0b76b..9fcc3d02 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
@@ -147,9 +147,8 @@
                                                std::string());
 
   scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-         NULL, web_contents(), profile(),
-         CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+         nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(bubble_content.title,
@@ -213,9 +212,8 @@
                                                std::string());
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Test if the correct radio item is selected for the blocked mediastream
@@ -239,9 +237,8 @@
 
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     // Change the radio setting.
     content_setting_bubble_model->OnRadioClicked(0);
   }
@@ -296,9 +293,8 @@
                                                std::string());
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Test if the correct radio item is selected for the blocked mediastream
@@ -317,9 +313,8 @@
 
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Test that the reload hint is displayed.
@@ -341,9 +336,8 @@
 
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+            nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Test that the reload hint is not displayed any more.
@@ -390,9 +384,8 @@
                                                std::string());
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     EXPECT_TRUE(bubble_content.custom_link.empty());
@@ -412,9 +405,8 @@
   }
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     EXPECT_EQ(1U, bubble_content.media_menus.size());
@@ -447,9 +439,8 @@
 
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Settings not changed yet, so the "settings changed" message should not be
@@ -471,9 +462,8 @@
 
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+            nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Test that the reload hint is displayed.
@@ -493,9 +483,8 @@
 
   {
     scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-           NULL, web_contents(), profile(),
-           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+        new ContentSettingMediaStreamBubbleModel(
+           nullptr, web_contents(), profile()));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     // Test that the reload hint is not displayed any more, because this is a
@@ -532,9 +521,8 @@
                                                std::string());
 
   scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(bubble_content.title,
@@ -566,9 +554,8 @@
                                                std::string(),
                                                std::string());
   content_setting_bubble_model.reset(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& new_bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(new_bubble_content.title,
@@ -611,9 +598,8 @@
                                                std::string());
 
   scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(bubble_content.title,
@@ -645,9 +631,8 @@
                                                std::string(),
                                                std::string());
   content_setting_bubble_model.reset(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& new_bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(new_bubble_content.title,
@@ -692,9 +677,8 @@
                                                std::string());
 
   scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(bubble_content.title,
@@ -724,9 +708,8 @@
                                                std::string());
 
   content_setting_bubble_model.reset(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
+      new ContentSettingMediaStreamBubbleModel(
+          nullptr, web_contents(), profile()));
   const ContentSettingBubbleModel::BubbleContent& new_bubble_content =
       content_setting_bubble_model->bubble_content();
   EXPECT_EQ(new_bubble_content.title,
@@ -854,8 +837,7 @@
       CONTENT_SETTINGS_TYPE_IMAGES);
   scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
       ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          NULL, web_contents(), profile(),
-          CONTENT_SETTINGS_TYPE_IMAGES));
+          nullptr, web_contents(), profile(), CONTENT_SETTINGS_TYPE_IMAGES));
   std::string title =
       content_setting_bubble_model->bubble_content().radio_group.radio_items[0];
   ASSERT_NE(std::string::npos, title.find(file_url));
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc
index d2099c8d..42bdd1d 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -44,48 +44,72 @@
 
 }  // namespace
 
-class ContentSettingBlockedImageModel : public ContentSettingImageModel {
+// The image models hierarchy:
+//
+// ContentSettingImageModel                  - base class
+//   ContentSettingSimpleImageModel            - single content setting
+//     ContentSettingBlockedImageModel           - generic blocked setting
+//     ContentSettingGeolocationImageModel       - geolocation
+//     ContentSettingRPHImageModel               - protocol handlers
+//     ContentSettingMIDISysExImageModel         - midi sysex
+//   ContentSettingMediaImageModel             - media
+
+class ContentSettingBlockedImageModel : public ContentSettingSimpleImageModel {
  public:
-  explicit ContentSettingBlockedImageModel(
-      ContentSettingsType content_settings_type);
+  explicit ContentSettingBlockedImageModel(ContentSettingsType content_type);
 
   void UpdateFromWebContents(WebContents* web_contents) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingBlockedImageModel);
 };
 
-class ContentSettingGeolocationImageModel : public ContentSettingImageModel {
+class ContentSettingGeolocationImageModel
+    : public ContentSettingSimpleImageModel {
  public:
   ContentSettingGeolocationImageModel();
 
   void UpdateFromWebContents(WebContents* web_contents) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingGeolocationImageModel);
 };
 
 // Image model for displaying media icons in the location bar.
 class ContentSettingMediaImageModel : public ContentSettingImageModel {
  public:
-  explicit ContentSettingMediaImageModel(ContentSettingsType type);
+  ContentSettingMediaImageModel();
 
   void UpdateFromWebContents(WebContents* web_contents) override;
+
+  ContentSettingBubbleModel* CreateBubbleModel(
+      ContentSettingBubbleModel::Delegate* delegate,
+      WebContents* web_contents,
+      Profile* profile) override;
+
+  bool ShouldRunAnimation(WebContents* web_contents) override;
+  void SetAnimationHasRun(WebContents* web_contents) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingMediaImageModel);
 };
 
-class ContentSettingRPHImageModel : public ContentSettingImageModel {
+class ContentSettingRPHImageModel : public ContentSettingSimpleImageModel {
  public:
   ContentSettingRPHImageModel();
 
   void UpdateFromWebContents(WebContents* web_contents) override;
 };
 
-class ContentSettingNotificationsImageModel : public ContentSettingImageModel {
- public:
-  ContentSettingNotificationsImageModel();
-
-  void UpdateFromWebContents(WebContents* web_contents) override;
-};
-
-class ContentSettingMIDISysExImageModel : public ContentSettingImageModel {
+class ContentSettingMIDISysExImageModel
+    : public ContentSettingSimpleImageModel {
  public:
   ContentSettingMIDISysExImageModel();
 
   void UpdateFromWebContents(WebContents* web_contents) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingMIDISysExImageModel);
 };
 
 namespace {
@@ -169,9 +193,77 @@
 
 }  // namespace
 
+// Single content setting ------------------------------------------------------
+
+ContentSettingSimpleImageModel::ContentSettingSimpleImageModel(
+    ContentSettingsType content_type)
+    : ContentSettingImageModel(),
+      content_type_(content_type) {
+}
+
+ContentSettingBubbleModel* ContentSettingSimpleImageModel::CreateBubbleModel(
+    ContentSettingBubbleModel::Delegate* delegate,
+    WebContents* web_contents,
+    Profile* profile) {
+  return ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+      delegate,
+      web_contents,
+      profile,
+      content_type());
+}
+
+bool ContentSettingSimpleImageModel::ShouldRunAnimation(
+    WebContents* web_contents) {
+  if (!web_contents)
+    return false;
+
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents);
+  if (!content_settings)
+    return false;
+
+  return !content_settings->IsBlockageIndicated(content_type());
+}
+
+void ContentSettingSimpleImageModel::SetAnimationHasRun(
+    WebContents* web_contents) {
+  if (!web_contents)
+    return;
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents);
+  if (content_settings)
+    content_settings->SetBlockageHasBeenIndicated(content_type());
+}
+
+// static
+scoped_ptr<ContentSettingImageModel>
+    ContentSettingSimpleImageModel::CreateForContentTypeForTesting(
+        ContentSettingsType content_settings_type) {
+  if (content_settings_type == CONTENT_SETTINGS_TYPE_GEOLOCATION)
+    return make_scoped_ptr(new ContentSettingGeolocationImageModel());
+
+  if (content_settings_type == CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS)
+    return make_scoped_ptr(new ContentSettingRPHImageModel());
+
+  if (content_settings_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM) {
+    NOTREACHED() << "The mediastream content setting is deprecated. "
+                 << "Media image model that used to be tied to this setting "
+                 << "can no longer be created by this function.";
+    return nullptr;
+  }
+
+  if (content_settings_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX)
+    return make_scoped_ptr(new ContentSettingMIDISysExImageModel());
+
+  return make_scoped_ptr(
+      new ContentSettingBlockedImageModel(content_settings_type));
+}
+
+// Generic blocked content settings --------------------------------------------
+
 ContentSettingBlockedImageModel::ContentSettingBlockedImageModel(
-    ContentSettingsType content_settings_type)
-    : ContentSettingImageModel(content_settings_type) {
+    ContentSettingsType content_type)
+    : ContentSettingSimpleImageModel(content_type) {
 }
 
 void ContentSettingBlockedImageModel::UpdateFromWebContents(
@@ -180,8 +272,9 @@
   if (!web_contents)
     return;
 
-  ContentSettingsType type = get_content_settings_type();
+  const ContentSettingsType type = content_type();
   const ContentSettingsImageDetails* image_details = GetImageDetails(type);
+  DCHECK(image_details) << "No entry for " << type << " in kImageDetails[].";
 
   int icon_id = image_details->blocked_icon_id;
   int tooltip_id = image_details->blocked_tooltip_id;
@@ -241,8 +334,10 @@
   set_tooltip(l10n_util::GetStringUTF8(tooltip_id));
 }
 
+// Geolocation -----------------------------------------------------------------
+
 ContentSettingGeolocationImageModel::ContentSettingGeolocationImageModel()
-    : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_GEOLOCATION) {
+    : ContentSettingSimpleImageModel(CONTENT_SETTINGS_TYPE_GEOLOCATION) {
 }
 
 void ContentSettingGeolocationImageModel::UpdateFromWebContents(
@@ -276,36 +371,16 @@
       IDS_GEOLOCATION_ALLOWED_TOOLTIP : IDS_GEOLOCATION_BLOCKED_TOOLTIP));
 }
 
-ContentSettingMediaImageModel::ContentSettingMediaImageModel(
-    ContentSettingsType type)
-    : ContentSettingImageModel(type) {
+// Media -----------------------------------------------------------------------
+
+ContentSettingMediaImageModel::ContentSettingMediaImageModel()
+    : ContentSettingImageModel() {
 }
 
 void ContentSettingMediaImageModel::UpdateFromWebContents(
     WebContents* web_contents) {
   set_visible(false);
 
-  // As long as a single icon is used to display the status of the camera and
-  // microphone usage only display an icon for the
-  // CONTENT_SETTINGS_TYPE_MEDIASTREAM. Don't display anything for
-  // CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
-  // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA.
-  // FIXME: Remove this hack and either display a two omnibox icons (one for
-  // camera and one for microphone), or don't create one image model per
-  // content type but per icon to display. The later is probably the right
-  // thing to do, bebacuse this also allows to add more content settings type
-  // for which no omnibox icon exists.
-  if (get_content_settings_type() == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
-      get_content_settings_type() == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) {
-    return;
-  }
-
-  // The ContentSettingMediaImageModel must not be used with a content type
-  // other then: CONTENT_SETTINGS_TYPE_MEDIASTREAM,
-  // CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
-  // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA.
-  DCHECK_EQ(get_content_settings_type(), CONTENT_SETTINGS_TYPE_MEDIASTREAM);
-
   if (!web_contents)
     return;
 
@@ -351,9 +426,51 @@
   set_visible(true);
 }
 
+ContentSettingBubbleModel* ContentSettingMediaImageModel::CreateBubbleModel(
+    ContentSettingBubbleModel::Delegate* delegate,
+    WebContents* web_contents,
+    Profile* profile) {
+  return new ContentSettingMediaStreamBubbleModel(delegate,
+                                                  web_contents,
+                                                  profile);
+}
+
+bool ContentSettingMediaImageModel::ShouldRunAnimation(
+    WebContents* web_contents) {
+  // TODO(msramek): For bubbles that are not tied to a single content setting,
+  // TabSpecificContentSettings is not a good place to store this bit.
+  // Perhaps we should instead use a map<WebContents*, bool> here in
+  // ContentSettingMediaImageModel.
+  if (!web_contents)
+    return false;
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents);
+  if (!content_settings)
+    return false;
+  return (!content_settings->IsBlockageIndicated(
+              CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) &&
+          !content_settings->IsBlockageIndicated(
+              CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
+}
+
+void ContentSettingMediaImageModel::SetAnimationHasRun(
+    WebContents* web_contents) {
+  if (!web_contents)
+    return;
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents);
+  if (content_settings) {
+    content_settings->SetBlockageHasBeenIndicated(
+        CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
+    content_settings->SetBlockageHasBeenIndicated(
+        CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
+  }
+}
+
+// Protocol handlers -----------------------------------------------------------
+
 ContentSettingRPHImageModel::ContentSettingRPHImageModel()
-    : ContentSettingImageModel(
-        CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS) {
+    : ContentSettingSimpleImageModel(CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS) {
   if (!UseVectorGraphics())
     SetIconByResourceId(IDR_REGISTER_PROTOCOL_HANDLER);
 #if !defined(OS_MACOSX)
@@ -379,18 +496,10 @@
   set_visible(true);
 }
 
-ContentSettingNotificationsImageModel::ContentSettingNotificationsImageModel()
-    : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
-}
-
-void ContentSettingNotificationsImageModel::UpdateFromWebContents(
-    WebContents* web_contents) {
-  // Notifications do not have a bubble.
-  set_visible(false);
-}
+// MIDI SysEx ------------------------------------------------------------------
 
 ContentSettingMIDISysExImageModel::ContentSettingMIDISysExImageModel()
-    : ContentSettingImageModel(CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
+    : ContentSettingSimpleImageModel(CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
 }
 
 void ContentSettingMIDISysExImageModel::UpdateFromWebContents(
@@ -424,31 +533,44 @@
       IDS_MIDI_SYSEX_ALLOWED_TOOLTIP : IDS_MIDI_SYSEX_BLOCKED_TOOLTIP));
 }
 
-ContentSettingImageModel::ContentSettingImageModel(
-    ContentSettingsType content_settings_type)
-    : content_settings_type_(content_settings_type),
-      is_visible_(false),
+// Base class ------------------------------------------------------------------
+
+ContentSettingImageModel::ContentSettingImageModel()
+    : is_visible_(false),
       icon_id_(0),
       explanatory_string_id_(0) {
 }
 
 // static
-ContentSettingImageModel*
-    ContentSettingImageModel::CreateContentSettingImageModel(
-    ContentSettingsType content_settings_type) {
-  if (content_settings_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
-    return new ContentSettingGeolocationImageModel();
-  } else if (content_settings_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
-    return new ContentSettingNotificationsImageModel();
-  } else if (content_settings_type == CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS) {
-    return new ContentSettingRPHImageModel();
-  } else if (content_settings_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM) {
-    return new ContentSettingMediaImageModel(content_settings_type);
-  } else if (content_settings_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
-    return new ContentSettingMIDISysExImageModel();
-  } else {
-    return new ContentSettingBlockedImageModel(content_settings_type);
-  }
+ScopedVector<ContentSettingImageModel>
+    ContentSettingImageModel::GenerateContentSettingImageModels() {
+  ScopedVector<ContentSettingImageModel> result;
+
+  // The ordering of the models here influences the order in which icons are
+  // shown in the omnibox.
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_COOKIES));
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_IMAGES));
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_PPAPI_BROKER));
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_PLUGINS));
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_POPUPS));
+  result.push_back(new ContentSettingGeolocationImageModel());
+  result.push_back(
+      new ContentSettingBlockedImageModel(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT));
+  result.push_back(new ContentSettingRPHImageModel());
+  result.push_back(new ContentSettingMediaImageModel());
+  result.push_back(
+      new ContentSettingBlockedImageModel(
+          CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS));
+  result.push_back(new ContentSettingMIDISysExImageModel());
+
+  return result.Pass();
 }
 
 void ContentSettingImageModel::SetIconByResourceId(int id) {
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.h b/chrome/browser/ui/content_settings/content_setting_image_model.h
index 633babf..dc1c667b 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.h
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.h
@@ -8,6 +8,8 @@
 #include <string>
 
 #include "base/basictypes.h"
+#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
+#include "chrome/browser/ui/content_settings/content_setting_bubble_model_delegate.h"
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "ui/gfx/image/image.h"
 
@@ -25,17 +27,28 @@
  public:
   virtual ~ContentSettingImageModel() {}
 
-  // Factory function.
-  static ContentSettingImageModel* CreateContentSettingImageModel(
-     ContentSettingsType content_settings_type);
+  // Generates a vector of all image models to be used within one window.
+  static ScopedVector<ContentSettingImageModel>
+      GenerateContentSettingImageModels();
 
   // Notifies this model that its setting might have changed and it may need to
   // update its visibility, icon and tooltip.
   virtual void UpdateFromWebContents(content::WebContents* web_contents) = 0;
 
-  ContentSettingsType get_content_settings_type() const {
-    return content_settings_type_;
-  }
+  // Creates the model for the bubble that will be attached to this image.
+  // The bubble model is owned by the caller.
+  virtual ContentSettingBubbleModel* CreateBubbleModel(
+      ContentSettingBubbleModel::Delegate* delegate,
+      content::WebContents* web_contents,
+      Profile* profile) = 0;
+
+  // Whether the animation should be run for the given |web_contents|.
+  virtual bool ShouldRunAnimation(content::WebContents* web_contents) = 0;
+
+  // Remembers that the animation has already run for the given |web_contents|,
+  // so that we do not restart it when the parent view is updated.
+  virtual void SetAnimationHasRun(content::WebContents* web_contents) = 0;
+
   bool is_visible() const { return is_visible_; }
   const gfx::Image& icon() const { return icon_; }
 #if defined(OS_MACOSX)
@@ -47,7 +60,7 @@
   std::string get_tooltip() const { return tooltip_; }
 
  protected:
-  explicit ContentSettingImageModel(ContentSettingsType content_settings_type);
+  ContentSettingImageModel();
   void SetIconByResourceId(int id);
 #if !defined(OS_MACOSX)
   void SetIconByVectorId(gfx::VectorIconId id, bool blocked);
@@ -60,7 +73,6 @@
   void set_tooltip(const std::string& tooltip) { tooltip_ = tooltip; }
 
  private:
-  const ContentSettingsType content_settings_type_;
   bool is_visible_;
   int icon_id_;
   gfx::Image icon_;
@@ -70,4 +82,30 @@
   DISALLOW_COPY_AND_ASSIGN(ContentSettingImageModel);
 };
 
+// A subclass for an image model tied to a single content type.
+class ContentSettingSimpleImageModel : public ContentSettingImageModel {
+ public:
+  explicit ContentSettingSimpleImageModel(ContentSettingsType content_type);
+
+  // ContentSettingImageModel implementation.
+  ContentSettingBubbleModel* CreateBubbleModel(
+      ContentSettingBubbleModel::Delegate* delegate,
+      content::WebContents* web_contents,
+      Profile* profile) override;
+  bool ShouldRunAnimation(content::WebContents* web_contents) override;
+  void SetAnimationHasRun(content::WebContents* web_contents) override;
+
+  // Factory method. Used only for testing.
+  static scoped_ptr<ContentSettingImageModel> CreateForContentTypeForTesting(
+      ContentSettingsType content_type);
+
+ protected:
+  ContentSettingsType content_type() { return content_type_; }
+
+ private:
+  ContentSettingsType content_type_;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingSimpleImageModel);
+};
+
 #endif  // CHROME_BROWSER_UI_CONTENT_SETTINGS_CONTENT_SETTING_IMAGE_MODEL_H_
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
new file mode 100644
index 0000000..3228e7a
--- /dev/null
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
@@ -0,0 +1,79 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/content_settings/content_setting_image_model.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/test/base/in_process_browser_test.h"
+
+using content::WebContents;
+
+typedef InProcessBrowserTest ContentSettingImageModelBrowserTest;
+
+// Tests that every model creates a valid bubble.
+IN_PROC_BROWSER_TEST_F(ContentSettingImageModelBrowserTest, CreateBubbleModel) {
+  WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  TabSpecificContentSettings* content_settings =
+      TabSpecificContentSettings::FromWebContents(web_contents);
+  content_settings->BlockAllContentForTesting();
+
+  // Test that image models tied to a single content setting create bubbles tied
+  // to the same setting.
+  static const ContentSettingsType content_settings_to_test[] = {
+      CONTENT_SETTINGS_TYPE_COOKIES,
+      CONTENT_SETTINGS_TYPE_IMAGES,
+      CONTENT_SETTINGS_TYPE_JAVASCRIPT,
+      CONTENT_SETTINGS_TYPE_PLUGINS,
+      CONTENT_SETTINGS_TYPE_POPUPS,
+      CONTENT_SETTINGS_TYPE_MIXEDSCRIPT,
+      CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
+      CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+      CONTENT_SETTINGS_TYPE_GEOLOCATION,
+      CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS,
+      CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
+  };
+
+  Profile* profile = browser()->profile();
+  for (ContentSettingsType type : content_settings_to_test) {
+    scoped_ptr<ContentSettingBubbleModel> bubble(
+        ContentSettingSimpleImageModel::CreateForContentTypeForTesting(type)
+            ->CreateBubbleModel(nullptr, web_contents, profile));
+    EXPECT_EQ(type, bubble->content_type());
+  }
+
+  // For other models, we can only test that they create a valid bubble.
+  ScopedVector<ContentSettingImageModel> models =
+      ContentSettingImageModel::GenerateContentSettingImageModels();
+  for (ContentSettingImageModel* model : models) {
+    EXPECT_TRUE(make_scoped_ptr(
+                    model->CreateBubbleModel(nullptr, web_contents, profile))
+                    .get());
+  }
+}
+
+// Tests that we correctly remember for which WebContents the animation has run,
+// and thus we should not run it again.
+IN_PROC_BROWSER_TEST_F(ContentSettingImageModelBrowserTest,
+                       ShouldRunAnimation) {
+  WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  scoped_ptr<ContentSettingImageModel> model =
+      ContentSettingSimpleImageModel::CreateForContentTypeForTesting(
+          CONTENT_SETTINGS_TYPE_IMAGES);
+
+  EXPECT_TRUE(model->ShouldRunAnimation(web_contents));
+  model->SetAnimationHasRun(web_contents);
+  EXPECT_FALSE(model->ShouldRunAnimation(web_contents));
+
+  // The animation has run for the current WebContents, but not for any other.
+  Profile* profile = browser()->profile();
+  WebContents::CreateParams create_params(profile);
+  WebContents* other_web_contents = WebContents::Create(create_params);
+  browser()->tab_strip_model()->TabStripModel::AppendWebContents(
+      other_web_contents, true);
+  EXPECT_TRUE(model->ShouldRunAnimation(other_web_contents));
+}
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
index 10b63bd..a469eae 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
@@ -60,9 +60,9 @@
   TabSpecificContentSettings::CreateForWebContents(web_contents());
   TabSpecificContentSettings* content_settings =
       TabSpecificContentSettings::FromWebContents(web_contents());
-  scoped_ptr<ContentSettingImageModel> content_setting_image_model(
-     ContentSettingImageModel::CreateContentSettingImageModel(
-         CONTENT_SETTINGS_TYPE_IMAGES));
+  scoped_ptr<ContentSettingImageModel> content_setting_image_model =
+     ContentSettingSimpleImageModel::CreateForContentTypeForTesting(
+         CONTENT_SETTINGS_TYPE_IMAGES);
   EXPECT_FALSE(content_setting_image_model->is_visible());
   EXPECT_TRUE(content_setting_image_model->icon().IsEmpty());
   EXPECT_TRUE(content_setting_image_model->get_tooltip().empty());
@@ -77,9 +77,9 @@
 
 TEST_F(ContentSettingImageModelTest, RPHUpdateFromWebContents) {
   TabSpecificContentSettings::CreateForWebContents(web_contents());
-  scoped_ptr<ContentSettingImageModel> content_setting_image_model(
-     ContentSettingImageModel::CreateContentSettingImageModel(
-         CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS));
+  scoped_ptr<ContentSettingImageModel> content_setting_image_model =
+     ContentSettingSimpleImageModel::CreateForContentTypeForTesting(
+         CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS);
   content_setting_image_model->UpdateFromWebContents(web_contents());
   EXPECT_FALSE(content_setting_image_model->is_visible());
 
@@ -100,7 +100,7 @@
       ->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_COOKIES,
                                  CONTENT_SETTING_BLOCK);
   scoped_ptr<ContentSettingImageModel> content_setting_image_model(
-     ContentSettingImageModel::CreateContentSettingImageModel(
+     ContentSettingSimpleImageModel::CreateForContentTypeForTesting(
          CONTENT_SETTINGS_TYPE_COOKIES));
   EXPECT_FALSE(content_setting_image_model->is_visible());
   EXPECT_TRUE(content_setting_image_model->icon().IsEmpty());
@@ -120,9 +120,9 @@
 
 // Regression test for http://crbug.com/161854.
 TEST_F(ContentSettingImageModelTest, NULLTabSpecificContentSettings) {
-  scoped_ptr<ContentSettingImageModel> content_setting_image_model(
-     ContentSettingImageModel::CreateContentSettingImageModel(
-         CONTENT_SETTINGS_TYPE_IMAGES));
+  scoped_ptr<ContentSettingImageModel> content_setting_image_model =
+     ContentSettingSimpleImageModel::CreateForContentTypeForTesting(
+         CONTENT_SETTINGS_TYPE_IMAGES);
   NotificationForwarder forwarder(content_setting_image_model.get());
   // Should not crash.
   TabSpecificContentSettings::CreateForWebContents(web_contents());
diff --git a/chrome/browser/ui/login/OWNERS b/chrome/browser/ui/login/OWNERS
new file mode 100644
index 0000000..6153f25a
--- /dev/null
+++ b/chrome/browser/ui/login/OWNERS
@@ -0,0 +1,3 @@
+davidben@chromium.org
+meacer@chromium.org
+vabr@chromium.org
diff --git a/chrome/browser/ui/startup/bad_flags_prompt.cc b/chrome/browser/ui/startup/bad_flags_prompt.cc
index 88b827a..553b5db8 100644
--- a/chrome/browser/ui/startup/bad_flags_prompt.cc
+++ b/chrome/browser/ui/startup/bad_flags_prompt.cc
@@ -20,7 +20,7 @@
 #include "components/infobars/core/simple_alert_infobar_delegate.h"
 #include "components/invalidation/impl/invalidation_switches.h"
 #include "components/nacl/common/nacl_switches.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "components/translate/core/common/translate_switches.h"
 #include "content/public/common/content_switches.h"
 #include "extensions/common/switches.h"
diff --git a/chrome/browser/ui/startup/default_browser_prompt_win.cc b/chrome/browser/ui/startup/default_browser_prompt_win.cc
index d2d01ce1..8ba18a2 100644
--- a/chrome/browser/ui/startup/default_browser_prompt_win.cc
+++ b/chrome/browser/ui/startup/default_browser_prompt_win.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/webui/set_as_default_browser_ui.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
diff --git a/chrome/browser/ui/toolbar/test_toolbar_model.cc b/chrome/browser/ui/toolbar/test_toolbar_model.cc
index ccec8f8..c00d396 100644
--- a/chrome/browser/ui/toolbar/test_toolbar_model.cc
+++ b/chrome/browser/ui/toolbar/test_toolbar_model.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/toolbar/test_toolbar_model.h"
 
 #include "grit/components_scaled_resources.h"
+#include "ui/gfx/vector_icons_public.h"
 
 TestToolbarModel::TestToolbarModel()
     : ChromeToolbarModel(),
@@ -45,6 +46,10 @@
   return icon_;
 }
 
+gfx::VectorIconId TestToolbarModel::GetVectorIcon() const {
+  return gfx::VectorIconId::VECTOR_ICON_NONE;
+}
+
 base::string16 TestToolbarModel::GetEVCertName() const {
   return (security_level_ == SecurityStateModel::EV_SECURE) ? ev_cert_name_
                                                             : base::string16();
diff --git a/chrome/browser/ui/toolbar/test_toolbar_model.h b/chrome/browser/ui/toolbar/test_toolbar_model.h
index 1bc04f5..08b3f15 100644
--- a/chrome/browser/ui/toolbar/test_toolbar_model.h
+++ b/chrome/browser/ui/toolbar/test_toolbar_model.h
@@ -24,6 +24,7 @@
   SecurityStateModel::SecurityLevel GetSecurityLevel(
       bool ignore_editing) const override;
   int GetIcon() const override;
+  gfx::VectorIconId GetVectorIcon() const override;
   base::string16 GetEVCertName() const override;
   bool ShouldDisplayURL() const override;
 
diff --git a/chrome/browser/ui/toolbar/toolbar_model_impl.cc b/chrome/browser/ui/toolbar/toolbar_model_impl.cc
index 4af29ad..0cefbc6b 100644
--- a/chrome/browser/ui/toolbar/toolbar_model_impl.cc
+++ b/chrome/browser/ui/toolbar/toolbar_model_impl.cc
@@ -35,6 +35,7 @@
 #include "net/ssl/ssl_connection_status_flags.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/text_elider.h"
+#include "ui/gfx/vector_icons_public.h"
 
 using content::NavigationController;
 using content::NavigationEntry;
@@ -138,15 +139,7 @@
 }
 
 int ToolbarModelImpl::GetIcon() const {
-  if (WouldPerformSearchTermReplacement(false))
-    return IDR_OMNIBOX_SEARCH_SECURED;
-
-  return GetIconForSecurityLevel(GetSecurityLevel(false));
-}
-
-int ToolbarModelImpl::GetIconForSecurityLevel(
-    SecurityStateModel::SecurityLevel level) const {
-  switch (level) {
+  switch (GetSecurityLevel(false)) {
     case SecurityStateModel::NONE:
       return IDR_LOCATION_BAR_HTTP;
     case SecurityStateModel::EV_SECURE:
@@ -165,6 +158,28 @@
   return IDR_LOCATION_BAR_HTTP;
 }
 
+gfx::VectorIconId ToolbarModelImpl::GetVectorIcon() const {
+#if !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_IOS)
+  switch (GetSecurityLevel(false)) {
+    case SecurityStateModel::NONE:
+      return gfx::VectorIconId::LOCATION_BAR_HTTP;
+    case SecurityStateModel::EV_SECURE:
+    case SecurityStateModel::SECURE:
+      return gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID;
+    case SecurityStateModel::SECURITY_WARNING:
+      // Surface Dubious as Neutral.
+      return gfx::VectorIconId::LOCATION_BAR_HTTP;
+    case SecurityStateModel::SECURITY_POLICY_WARNING:
+      return gfx::VectorIconId::BUSINESS;
+    case SecurityStateModel::SECURITY_ERROR:
+      return gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID;
+  }
+#endif
+
+  NOTREACHED();
+  return gfx::VectorIconId::VECTOR_ICON_NONE;
+}
+
 base::string16 ToolbarModelImpl::GetEVCertName() const {
   if (GetSecurityLevel(false) != SecurityStateModel::EV_SECURE)
     return base::string16();
diff --git a/chrome/browser/ui/toolbar/toolbar_model_impl.h b/chrome/browser/ui/toolbar/toolbar_model_impl.h
index 3bca88e..2a6a416 100644
--- a/chrome/browser/ui/toolbar/toolbar_model_impl.h
+++ b/chrome/browser/ui/toolbar/toolbar_model_impl.h
@@ -43,13 +43,10 @@
   SecurityStateModel::SecurityLevel GetSecurityLevel(
       bool ignore_editing) const override;
   int GetIcon() const override;
+  gfx::VectorIconId GetVectorIcon() const override;
   base::string16 GetEVCertName() const override;
   bool ShouldDisplayURL() const override;
 
-  // As |GetIcon()|, but returns the icon only taking into account the security
-  // level| given, ignoring search term replacement state.
-  int GetIconForSecurityLevel(SecurityStateModel::SecurityLevel level) const;
-
   // Returns the navigation controller used to retrieve the navigation entry
   // from which the states are retrieved.
   // If this returns NULL, default values are used.
diff --git a/chrome/browser/ui/views/autofill/save_card_icon_view.cc b/chrome/browser/ui/views/autofill/save_card_icon_view.cc
index 878b6e0f..68b16db2 100644
--- a/chrome/browser/ui/views/autofill/save_card_icon_view.cc
+++ b/chrome/browser/ui/views/autofill/save_card_icon_view.cc
@@ -51,7 +51,7 @@
 }
 
 gfx::VectorIconId SaveCardIconView::GetVectorIcon() const {
-  return gfx::VectorIconId::AUTOFILL;
+  return gfx::VectorIconId::CREDIT_CARD;
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc
index 9724869..3152d0b 100644
--- a/chrome/browser/ui/views/create_application_shortcut_view.cc
+++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -176,24 +176,11 @@
 }
 
 void AppInfoView::UpdateIcon(const gfx::ImageFamily& image) {
-  // Get the icon closest to the desired preview size.
-  const gfx::Image* icon = image.GetBest(kIconPreviewSizePixels,
-                                         kIconPreviewSizePixels);
-  if (!icon || icon->IsEmpty())
-    // The family has no icons. Leave the image blank.
-    return;
-  const SkBitmap& bitmap = *icon->ToSkBitmap();
-  if (bitmap.width() == kIconPreviewSizePixels &&
-      bitmap.height() == kIconPreviewSizePixels) {
-    icon_->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(bitmap));
-  } else {
-    // Resize the image to the desired size.
-    SkBitmap resized_bitmap = skia::ImageOperations::Resize(
-        bitmap, skia::ImageOperations::RESIZE_LANCZOS3,
-        kIconPreviewSizePixels, kIconPreviewSizePixels);
-
-    icon_->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(resized_bitmap));
-  }
+  // Get an icon at the desired preview size (scaling from a larger image if
+  // none is available at that exact size).
+  gfx::Image icon =
+      image.CreateExact(kIconPreviewSizePixels, kIconPreviewSizePixels);
+  icon_->SetImage(icon.ToImageSkia());
 }
 
 void AppInfoView::OnPaint(gfx::Canvas* canvas) {
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
index f5863c9e..fc4a121 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/ui/views/location_bar/content_setting_image_view.h"
 
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
 #include "chrome/browser/ui/content_settings/content_setting_image_model.h"
@@ -34,7 +33,7 @@
     (kOpenTimeMS * 2) + kStayOpenTimeMS;
 
 ContentSettingImageView::ContentSettingImageView(
-    ContentSettingsType content_type,
+    ContentSettingImageModel* image_model,
     LocationBarView* parent,
     const gfx::FontList& font_list,
     SkColor text_color,
@@ -45,9 +44,7 @@
                           parent_background_color,
                           false),
       parent_(parent),
-      content_setting_image_model_(
-          ContentSettingImageModel::CreateContentSettingImageModel(
-              content_type)),
+      content_setting_image_model_(image_model),
       slide_animator_(this),
       pause_animation_(false),
       pause_animation_state_(0.0),
@@ -86,12 +83,9 @@
       base::UTF8ToUTF16(content_setting_image_model_->get_tooltip()));
   SetVisible(true);
 
-  // If the content blockage should be indicated to the user, start the
-  // animation and record that we indicated the blockage.
-  TabSpecificContentSettings* content_settings = web_contents ?
-      TabSpecificContentSettings::FromWebContents(web_contents) : NULL;
-  if (!content_settings || content_settings->IsBlockageIndicated(
-      content_setting_image_model_->get_content_settings_type()))
+  // If the content usage or blockage should be indicated to the user, start the
+  // animation and record that the icon has been shown.
+  if (!content_setting_image_model_->ShouldRunAnimation(web_contents))
     return;
 
   // We just ignore this blockage if we're already showing some other string to
@@ -104,8 +98,7 @@
     slide_animator_.Show();
   }
 
-  content_settings->SetBlockageHasBeenIndicated(
-      content_setting_image_model_->get_content_settings_type());
+  content_setting_image_model_->SetAnimationHasRun(web_contents);
 }
 
 SkColor ContentSettingImageView::GetTextColor() const {
@@ -206,10 +199,9 @@
   if (web_contents && !bubble_widget_) {
     bubble_widget_ =
         parent_->delegate()->CreateViewsBubble(new ContentSettingBubbleContents(
-            ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            content_setting_image_model_->CreateBubbleModel(
                 parent_->delegate()->GetContentSettingBubbleModelDelegate(),
-                web_contents, parent_->profile(),
-                content_setting_image_model_->get_content_settings_type()),
+                web_contents, parent_->profile()),
             web_contents, this, views::BubbleBorder::TOP_RIGHT));
     bubble_widget_->AddObserver(this);
     bubble_widget_->Show();
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.h b/chrome/browser/ui/views/location_bar/content_setting_image_view.h
index ec4c5b1..9e0f50cd 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.h
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CONTENT_SETTING_IMAGE_VIEW_H_
 
 #include "base/memory/scoped_ptr.h"
+#include "chrome/browser/ui/content_settings/content_setting_image_model.h"
 #include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h"
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "ui/gfx/animation/animation_delegate.h"
@@ -37,8 +38,9 @@
                                 public gfx::AnimationDelegate,
                                 public views::WidgetObserver {
  public:
+  // ContentSettingImageView takes ownership of its |image_model|.
   // TODO(estade): remove |text_color| because it isn't necessary for MD.
-  ContentSettingImageView(ContentSettingsType content_type,
+  ContentSettingImageView(ContentSettingImageModel* image_model,
                           LocationBarView* parent,
                           const gfx::FontList& font_list,
                           SkColor text_color,
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 533fef3f..52a9952 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -86,6 +86,7 @@
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/image/image_skia_operations.h"
+#include "ui/gfx/paint_vector_icon.h"
 #include "ui/gfx/scoped_canvas.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/gfx/text_utils.h"
@@ -295,14 +296,17 @@
   AddChildView(mic_search_view_);
 
   const SkColor text_color = GetColor(SecurityStateModel::NONE, TEXT);
-  for (ContentSettingsType type :
-       ContentSettingBubbleModel::GetSupportedBubbleTypes()) {
-    ContentSettingImageView* content_blocked_view = new ContentSettingImageView(
-        type, this, bubble_font_list, text_color, background_color);
-    content_setting_views_.push_back(content_blocked_view);
-    content_blocked_view->SetVisible(false);
-    AddChildView(content_blocked_view);
+  ScopedVector<ContentSettingImageModel> models =
+      ContentSettingImageModel::GenerateContentSettingImageModels();
+  for (ContentSettingImageModel* model : models.get()) {
+    // ContentSettingImageView takes ownership of its model.
+    ContentSettingImageView* image_view = new ContentSettingImageView(
+        model, this, bubble_font_list, text_color, background_color);
+    content_setting_views_.push_back(image_view);
+    image_view->SetVisible(false);
+    AddChildView(image_view);
   }
+  models.weak_clear();
 
   zoom_view_ = new ZoomView(delegate_);
   AddChildView(zoom_view_);
@@ -1395,8 +1399,11 @@
 // LocationBarView, private OmniboxEditController implementation:
 
 void LocationBarView::OnChanged() {
-  int icon_id = omnibox_view_->GetIcon();
-  location_icon_view_->SetImage(GetThemeProvider()->GetImageSkiaNamed(icon_id));
+  location_icon_view_->SetImage(
+      ui::MaterialDesignController::IsModeMaterial()
+          ? gfx::CreateVectorIcon(omnibox_view_->GetVectorIcon(), 16,
+                                  gfx::kChromeIconGrey)
+          : *GetThemeProvider()->GetImageSkiaNamed(omnibox_view_->GetIcon()));
   location_icon_view_->ShowTooltip(!GetOmniboxView()->IsEditingOrEmpty());
 
   Layout();
diff --git a/chrome/browser/ui/views/simple_message_box_views.cc b/chrome/browser/ui/views/simple_message_box_views.cc
index 50433760..1732509b 100644
--- a/chrome/browser/ui/views/simple_message_box_views.cc
+++ b/chrome/browser/ui/views/simple_message_box_views.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/ui/simple_message_box_internal.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/constrained_window/constrained_window_views.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/native_widget_types.h"
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
index 2fbf5ed..c911022 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -1795,12 +1795,10 @@
     const gfx::Point& screen_point,
     bool exclude_dragged_view) {
   std::set<gfx::NativeWindow> exclude;
-  if (exclude_dragged_view) {
-    gfx::NativeWindow dragged_window =
-        attached_tabstrip_->GetWidget()->GetNativeWindow();
-    if (dragged_window)
-      exclude.insert(dragged_window);
-  }
+  gfx::NativeWindow dragged_window =
+      attached_tabstrip_->GetWidget()->GetNativeWindow();
+  if (exclude_dragged_view && dragged_window)
+    exclude.insert(dragged_window);
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
   // Exclude windows which are pending deletion via Browser::TabStripEmpty().
   // These windows can be returned in the Linux Aura port because the browser
@@ -1815,8 +1813,6 @@
       exclude.insert((*it)->window()->GetNativeWindow());
   }
 #endif
-  return GetLocalProcessWindowAtPoint(host_desktop_type_,
-                                      screen_point,
-                                      exclude);
-
+  return GetLocalProcessWindowAtPoint(host_desktop_type_, screen_point, exclude,
+                                      dragged_window);
 }
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index 5fe10f19..46fee491 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -408,7 +408,7 @@
   // For custom tab backgrounds the background starts at the top of the tab
   // strip. Otherwise the background starts at the top of the frame.
   const int offset_y = theme_provider->HasCustomImage(bg_id) ?
-      0 : background_offset_.y();
+      -GetLayoutConstant(TAB_TOP_EXCLUSION_HEIGHT) : background_offset_.y();
 
   // The new tab background is mirrored in RTL mode, but the theme background
   // should never be mirrored. Mirror it here to compensate.
diff --git a/chrome/browser/ui/views/tabs/window_finder.h b/chrome/browser/ui/views/tabs/window_finder.h
index 91de6c1..cdb61c1b 100644
--- a/chrome/browser/ui/views/tabs/window_finder.h
+++ b/chrome/browser/ui/views/tabs/window_finder.h
@@ -9,18 +9,19 @@
 
 #include "chrome/browser/ui/host_desktop.h"
 
-namespace aura {
-class Window;
-}
-
 namespace gfx {
 class Point;
 }
 
 // Returns the Window at the specified point, ignoring the windows in |ignore|.
+// On Android, |source| is required to access root window. All other platforms
+// do not use the parameter.
+// TODO(bshe): Remove |source| once we have a way to get root window from
+// |screen_point| on Android. See crbug.com/549735
 gfx::NativeWindow GetLocalProcessWindowAtPoint(
     chrome::HostDesktopType host_desktop_type,
     const gfx::Point& screen_point,
-    const std::set<gfx::NativeWindow>& ignore);
+    const std::set<gfx::NativeWindow>& ignore,
+    gfx::NativeWindow source);
 
 #endif  // CHROME_BROWSER_UI_VIEWS_TABS_WINDOW_FINDER_H_
diff --git a/chrome/browser/ui/views/tabs/window_finder_android.cc b/chrome/browser/ui/views/tabs/window_finder_android.cc
new file mode 100644
index 0000000..21c4449
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/window_finder_android.cc
@@ -0,0 +1,21 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/tabs/window_finder.h"
+
+#include "chrome/browser/ui/host_desktop.h"
+#include "chrome/browser/ui/views/tabs/window_finder_impl.h"
+#include "ui/aura/window.h"
+
+gfx::NativeWindow GetLocalProcessWindowAtPoint(
+    chrome::HostDesktopType host_desktop_type,
+    const gfx::Point& screen_point,
+    const std::set<gfx::NativeWindow>& ignore,
+    gfx::NativeWindow source) {
+  gfx::NativeWindow root_window = source ? source->GetRootWindow() : nullptr;
+  if (!root_window)
+    return nullptr;
+  return GetLocalProcessWindowAtPointImpl(screen_point, ignore, std::set<int>(),
+                                          root_window);
+}
diff --git a/chrome/browser/ui/views/tabs/window_finder_ash.cc b/chrome/browser/ui/views/tabs/window_finder_ash.cc
index 1628a82..e6de710 100644
--- a/chrome/browser/ui/views/tabs/window_finder_ash.cc
+++ b/chrome/browser/ui/views/tabs/window_finder_ash.cc
@@ -6,55 +6,15 @@
 
 #include "ash/shell_window_ids.h"
 #include "ash/wm/coordinate_conversion.h"
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/wm/core/window_util.h"
-
-namespace {
-
-gfx::NativeWindow GetLocalProcessWindowAtPointImpl(
-    const gfx::Point& screen_point,
-    const std::set<gfx::NativeWindow>& ignore,
-    gfx::NativeWindow window) {
-  if (ignore.find(window) != ignore.end())
-    return NULL;
-
-  if (!window->IsVisible())
-    return NULL;
-
-  if (window->id() == ash::kShellWindowId_PhantomWindow ||
-      window->id() == ash::kShellWindowId_OverlayContainer ||
-      window->id() == ash::kShellWindowId_MouseCursorContainer)
-    return NULL;
-
-  if (window->layer()->type() == ui::LAYER_TEXTURED) {
-    // Returns the window that has visible layer and can hit the
-    // |screen_point|, because we want to detach the tab as soon as
-    // the dragging mouse moved over to the window that can hide the
-    // moving tab.
-    aura::client::ScreenPositionClient* client =
-        aura::client::GetScreenPositionClient(window->GetRootWindow());
-    gfx::Point local_point = screen_point;
-    client->ConvertPointFromScreen(window, &local_point);
-    return window->GetEventHandlerForPoint(local_point) ? window : nullptr;
-  }
-
-  for (aura::Window::Windows::const_reverse_iterator i =
-           window->children().rbegin(); i != window->children().rend(); ++i) {
-    gfx::NativeWindow result =
-        GetLocalProcessWindowAtPointImpl(screen_point, ignore, *i);
-    if (result)
-      return result;
-  }
-  return NULL;
-}
-
-}  // namespace
+#include "chrome/browser/ui/views/tabs/window_finder_impl.h"
 
 gfx::NativeWindow GetLocalProcessWindowAtPointAsh(
     const gfx::Point& screen_point,
     const std::set<gfx::NativeWindow>& ignore) {
-  return GetLocalProcessWindowAtPointImpl(
-      screen_point, ignore, ::ash::wm::GetRootWindowAt(screen_point));
+  gfx::NativeWindow window = ::ash::wm::GetRootWindowAt(screen_point);
+  std::set<int> ignore_ash_ids = {ash::kShellWindowId_PhantomWindow,
+                                  ash::kShellWindowId_OverlayContainer,
+                                  ash::kShellWindowId_MouseCursorContainer};
+  return GetLocalProcessWindowAtPointImpl(screen_point, ignore, ignore_ash_ids,
+                                          window);
 }
diff --git a/chrome/browser/ui/views/tabs/window_finder_chromeos.cc b/chrome/browser/ui/views/tabs/window_finder_chromeos.cc
index 175615c..5cb43f9 100644
--- a/chrome/browser/ui/views/tabs/window_finder_chromeos.cc
+++ b/chrome/browser/ui/views/tabs/window_finder_chromeos.cc
@@ -14,6 +14,7 @@
 gfx::NativeWindow GetLocalProcessWindowAtPoint(
     chrome::HostDesktopType host_desktop_type,
     const gfx::Point& screen_point,
-    const std::set<gfx::NativeWindow>& ignore) {
+    const std::set<gfx::NativeWindow>& ignore,
+    gfx::NativeWindow source) {
   return GetLocalProcessWindowAtPointAsh(screen_point, ignore);
 }
diff --git a/chrome/browser/ui/views/tabs/window_finder_impl.cc b/chrome/browser/ui/views/tabs/window_finder_impl.cc
new file mode 100644
index 0000000..06c1356d
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/window_finder_impl.cc
@@ -0,0 +1,48 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/tabs/window_finder_impl.h"
+
+#include "ui/aura/client/screen_position_client.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_event_dispatcher.h"
+#include "ui/compositor/layer.h"
+#include "ui/wm/core/window_util.h"
+
+gfx::NativeWindow GetLocalProcessWindowAtPointImpl(
+    const gfx::Point& screen_point,
+    const std::set<gfx::NativeWindow>& ignore,
+    const std::set<int>& ignore_ids,
+    gfx::NativeWindow window) {
+  if (ignore.find(window) != ignore.end())
+    return nullptr;
+
+  if (!window->IsVisible())
+    return nullptr;
+
+  if (ignore_ids.find(window->id()) != ignore_ids.end())
+    return nullptr;
+
+  if (window->layer()->type() == ui::LAYER_TEXTURED) {
+    // Returns the window that has visible layer and can hit the
+    // |screen_point|, because we want to detach the tab as soon as
+    // the dragging mouse moved over to the window that can hide the
+    // moving tab.
+    aura::client::ScreenPositionClient* client =
+        aura::client::GetScreenPositionClient(window->GetRootWindow());
+    gfx::Point local_point = screen_point;
+    client->ConvertPointFromScreen(window, &local_point);
+    return window->GetEventHandlerForPoint(local_point) ? window : nullptr;
+  }
+
+  for (aura::Window::Windows::const_reverse_iterator i =
+           window->children().rbegin();
+       i != window->children().rend(); ++i) {
+    gfx::NativeWindow result =
+        GetLocalProcessWindowAtPointImpl(screen_point, ignore, ignore_ids, *i);
+    if (result)
+      return result;
+  }
+  return nullptr;
+}
diff --git a/chrome/browser/ui/views/tabs/window_finder_impl.h b/chrome/browser/ui/views/tabs/window_finder_impl.h
new file mode 100644
index 0000000..17e16cab
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/window_finder_impl.h
@@ -0,0 +1,22 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_TABS_WINDOW_FINDER_IMPL_H_
+#define CHROME_BROWSER_UI_VIEWS_TABS_WINDOW_FINDER_IMPL_H_
+
+#include <set>
+
+#include "ui/gfx/native_widget_types.h"
+
+namespace gfx {
+class Point;
+}
+
+gfx::NativeWindow GetLocalProcessWindowAtPointImpl(
+    const gfx::Point& screen_point,
+    const std::set<gfx::NativeWindow>& ignore,
+    const std::set<int>& ignore_ids,
+    gfx::NativeWindow window);
+
+#endif  // CHROME_BROWSER_UI_VIEWS_TABS_WINDOW_FINDER_IMPL_H_
diff --git a/chrome/browser/ui/views/tabs/window_finder_mac.mm b/chrome/browser/ui/views/tabs/window_finder_mac.mm
index b2307da..dfe6e536 100644
--- a/chrome/browser/ui/views/tabs/window_finder_mac.mm
+++ b/chrome/browser/ui/views/tabs/window_finder_mac.mm
@@ -7,7 +7,8 @@
 gfx::NativeWindow GetLocalProcessWindowAtPoint(
     chrome::HostDesktopType host_desktop_type,
     const gfx::Point& screen_point,
-    const std::set<gfx::NativeWindow>& ignore) {
+    const std::set<gfx::NativeWindow>& ignore,
+    gfx::NativeWindow source) {
   NOTIMPLEMENTED();
   return NULL;
 }
diff --git a/chrome/browser/ui/views/tabs/window_finder_win.cc b/chrome/browser/ui/views/tabs/window_finder_win.cc
index 2596c188..63d2f48 100644
--- a/chrome/browser/ui/views/tabs/window_finder_win.cc
+++ b/chrome/browser/ui/views/tabs/window_finder_win.cc
@@ -262,7 +262,8 @@
 gfx::NativeWindow GetLocalProcessWindowAtPoint(
     chrome::HostDesktopType host_desktop_type,
     const gfx::Point& screen_point,
-    const std::set<gfx::NativeWindow>& ignore) {
+    const std::set<gfx::NativeWindow>& ignore,
+    gfx::NativeWindow source) {
 #if defined(USE_ASH)
   if (host_desktop_type == chrome::HOST_DESKTOP_TYPE_ASH)
     return GetLocalProcessWindowAtPointAsh(screen_point, ignore);
diff --git a/chrome/browser/ui/views/tabs/window_finder_x11.cc b/chrome/browser/ui/views/tabs/window_finder_x11.cc
index 18c9c02..68df7182 100644
--- a/chrome/browser/ui/views/tabs/window_finder_x11.cc
+++ b/chrome/browser/ui/views/tabs/window_finder_x11.cc
@@ -30,7 +30,8 @@
 gfx::NativeWindow GetLocalProcessWindowAtPoint(
     chrome::HostDesktopType host_desktop_type,
     const gfx::Point& screen_point,
-    const std::set<gfx::NativeWindow>& ignore) {
+    const std::set<gfx::NativeWindow>& ignore,
+    gfx::NativeWindow source) {
 #if defined(USE_ASH)
   if (host_desktop_type == chrome::HOST_DESKTOP_TYPE_ASH)
     return GetLocalProcessWindowAtPointAsh(screen_point, ignore);
diff --git a/chrome/browser/ui/website_settings/website_settings.cc b/chrome/browser/ui/website_settings/website_settings.cc
index a62ecbe..a82135a 100644
--- a/chrome/browser/ui/website_settings/website_settings.cc
+++ b/chrome/browser/ui/website_settings/website_settings.cc
@@ -268,47 +268,8 @@
   // compare it against other kinds of actions in WebsiteSettings[PopupView].
   RecordWebsiteSettingsAction(WEBSITE_SETTINGS_CHANGED_PERMISSION);
 
-  // TODO(raymes): The scoping here should be a property of ContentSettingsInfo.
-  // Make this happen! crbug.com/444742.
-  ContentSettingsPattern primary_pattern;
-  ContentSettingsPattern secondary_pattern;
-  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
-      type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX ||
-      type == CONTENT_SETTINGS_TYPE_FULLSCREEN) {
-    // TODO(markusheintz): The rule we create here should also change the
-    // location permission for iframed content.
-    primary_pattern = ContentSettingsPattern::FromURLNoWildcard(site_url_);
-    secondary_pattern = ContentSettingsPattern::FromURLNoWildcard(site_url_);
-  } else if (type == CONTENT_SETTINGS_TYPE_IMAGES ||
-             type == CONTENT_SETTINGS_TYPE_JAVASCRIPT ||
-             type == CONTENT_SETTINGS_TYPE_PLUGINS ||
-             type == CONTENT_SETTINGS_TYPE_POPUPS ||
-             type == CONTENT_SETTINGS_TYPE_MOUSELOCK ||
-             type == CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS ||
-             type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) {
-    primary_pattern = ContentSettingsPattern::FromURL(site_url_);
-    secondary_pattern = ContentSettingsPattern::Wildcard();
-  } else if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
-             type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA ||
-             type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
-    primary_pattern = ContentSettingsPattern::FromURLNoWildcard(site_url_);
-    secondary_pattern = ContentSettingsPattern::Wildcard();
-  } else {
-    NOTREACHED() << "ContentSettingsType " << type << "is not supported.";
-  }
-
-  // Permission settings are specified via rules. There exists always at least
-  // one rule for the default setting. Get the rule that currently defines
-  // the permission for the given permission |type|. Then test whether the
-  // existing rule is more specific than the rule we are about to create. If
-  // the existing rule is more specific, than change the existing rule instead
-  // of creating a new rule that would be hidden behind the existing rule.
-  content_settings::SettingInfo info;
-  scoped_ptr<base::Value> v =
-      content_settings_->GetWebsiteSetting(
-          site_url_, site_url_, type, std::string(), &info);
-  content_settings_->SetNarrowestWebsiteSetting(
-      primary_pattern, secondary_pattern, type, std::string(), setting, info);
+  content_settings_->SetNarrowestContentSetting(site_url_, site_url_, type,
+                                                setting);
 
   show_info_bar_ = true;
 
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index cb5719e..0a4e895 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -37,9 +37,14 @@
                              IDS_MANAGE_EXTENSIONS_SETTING_WINDOWS_TITLE);
   source->AddLocalizedString("toolbarTitle", IDS_MD_EXTENSIONS_TOOLBAR_TITLE);
   source->AddLocalizedString("search", IDS_MD_EXTENSIONS_SEARCH);
+  source->AddLocalizedString("sidebarApps", IDS_MD_EXTENSIONS_SIDEBAR_APPS);
   source->AddLocalizedString("sidebarExtensions",
                              IDS_MD_EXTENSIONS_SIDEBAR_EXTENSIONS);
-  source->AddLocalizedString("sidebarApps", IDS_MD_EXTENSIONS_SIDEBAR_APPS);
+  source->AddLocalizedString("sidebarLoadUnpacked",
+                             IDS_MD_EXTENSIONS_SIDEBAR_LOAD_UNPACKED);
+  source->AddLocalizedString("sidebarPack", IDS_MD_EXTENSIONS_SIDEBAR_PACK);
+  source->AddLocalizedString("sidebarUpdateNow",
+                             IDS_MD_EXTENSIONS_SIDEBAR_UPDATE_NOW);
   source->AddLocalizedString("sidebarWebsites",
                              IDS_MD_EXTENSIONS_SIDEBAR_WEBSITES);
   source->AddLocalizedString("developerMode",
@@ -60,6 +65,7 @@
   source->AddResourcePath("manager.css", IDR_MD_EXTENSIONS_MANAGER_CSS);
   source->AddResourcePath("manager.html", IDR_MD_EXTENSIONS_MANAGER_HTML);
   source->AddResourcePath("manager.js", IDR_MD_EXTENSIONS_MANAGER_JS);
+  source->AddResourcePath("icons.html", IDR_MD_EXTENSIONS_ICONS_HTML);
   source->AddResourcePath("item.css", IDR_MD_EXTENSIONS_ITEM_CSS);
   source->AddResourcePath("item.html", IDR_MD_EXTENSIONS_ITEM_HTML);
   source->AddResourcePath("item.js", IDR_MD_EXTENSIONS_ITEM_JS);
diff --git a/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc b/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc
index 5849f75..ffcecc2 100644
--- a/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc
@@ -34,7 +34,7 @@
 using ui::WebDialogDelegate;
 
 namespace {
-const int kMaxHeight = 300;
+const int kMaxHeight = 400;
 #if !defined(OS_MACOSX)
 const int kMinHeight = 80;
 #endif  // !defined(OS_MACOSX)
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
index d9433b94..444004d 100644
--- a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
@@ -16,6 +16,7 @@
 #include "base/values.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/browsing_data/autofill_counter.h"
 #include "chrome/browser/browsing_data/browsing_data_counter.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
 #include "chrome/browser/browsing_data/browsing_data_remover.h"
@@ -79,6 +80,7 @@
     AddCounter(make_scoped_ptr(new PasswordsCounter()));
     AddCounter(make_scoped_ptr(new HistoryCounter()));
     AddCounter(make_scoped_ptr(new CacheCounter()));
+    AddCounter(make_scoped_ptr(new AutofillCounter()));
 
     sync_service_ =
         ProfileSyncServiceFactory::GetForProfile(Profile::FromWebUI(web_ui()));
@@ -125,6 +127,130 @@
                                    base::StringValue(text));
 }
 
+// static
+base::string16 ClearBrowserDataHandler::GetCounterTextFromResult(
+    const BrowsingDataCounter::Result* result) {
+  base::string16 text;
+  std::string pref_name = result->source()->GetPrefName();
+
+  if (!result->Finished()) {
+    // The counter is still counting.
+    text = l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING);
+
+  } else if (pref_name == prefs::kDeletePasswords) {
+    // Passwords counter.
+    BrowsingDataCounter::ResultInt passwords_count =
+        static_cast<const BrowsingDataCounter::FinishedResult*>(
+            result)->Value();
+    text = l10n_util::GetPluralStringFUTF16(
+        IDS_DEL_PASSWORDS_COUNTER, passwords_count);
+
+  } else if (pref_name == prefs::kDeleteCache) {
+    // Cache counter.
+    BrowsingDataCounter::ResultInt cache_size_bytes =
+        static_cast<const BrowsingDataCounter::FinishedResult*>(
+            result)->Value();
+
+    PrefService* prefs = result->source()->GetProfile()->GetPrefs();
+    BrowsingDataRemover::TimePeriod time_period =
+        static_cast<BrowsingDataRemover::TimePeriod>(
+            prefs->GetInteger(prefs::kDeleteTimePeriod));
+
+    // Three cases: Nonzero result for the entire cache, nonzero result for
+    // a subset of cache (i.e. a finite time interval), and almost zero (< 1MB).
+    static const int kBytesInAMegabyte = 1024 * 1024;
+    if (cache_size_bytes >= kBytesInAMegabyte) {
+      base::string16 formatted_size = ui::FormatBytes(cache_size_bytes);
+      text = time_period == BrowsingDataRemover::EVERYTHING
+          ? formatted_size
+          : l10n_util::GetStringFUTF16(IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE,
+                                       formatted_size);
+    } else {
+      base::string16 formatted_size = ui::FormatBytes(kBytesInAMegabyte);
+      text = l10n_util::GetStringFUTF16(IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE,
+                                        formatted_size);
+    }
+
+  } else if (pref_name == prefs::kDeleteBrowsingHistory) {
+    // History counter.
+    const HistoryCounter::HistoryResult* history_result =
+        static_cast<const HistoryCounter::HistoryResult*>(result);
+    BrowsingDataCounter::ResultInt local_item_count = history_result->Value();
+    bool has_synced_visits = history_result->has_synced_visits();
+
+    text = has_synced_visits
+        ? l10n_util::GetPluralStringFUTF16(
+              IDS_DEL_BROWSING_HISTORY_COUNTER_SYNCED, local_item_count)
+        : l10n_util::GetPluralStringFUTF16(
+              IDS_DEL_BROWSING_HISTORY_COUNTER, local_item_count);
+
+  } else if (pref_name == prefs::kDeleteFormData) {
+    // Autofill counter.
+    const AutofillCounter::AutofillResult* autofill_result =
+        static_cast<const AutofillCounter::AutofillResult*>(result);
+    AutofillCounter::ResultInt num_suggestions = autofill_result->Value();
+    AutofillCounter::ResultInt num_credit_cards =
+        autofill_result->num_credit_cards();
+    AutofillCounter::ResultInt num_addresses = autofill_result->num_addresses();
+
+    std::vector<base::string16> displayed_strings;
+
+    if (num_credit_cards) {
+      displayed_strings.push_back(l10n_util::GetPluralStringFUTF16(
+          IDS_DEL_AUTOFILL_COUNTER_CREDIT_CARDS, num_credit_cards));
+    }
+    if (num_addresses) {
+      displayed_strings.push_back(l10n_util::GetPluralStringFUTF16(
+          IDS_DEL_AUTOFILL_COUNTER_ADDRESSES, num_addresses));
+    }
+    if (num_suggestions) {
+      // We use a different wording for autocomplete suggestions based on the
+      // length of the entire string.
+      switch (displayed_strings.size()) {
+        case 0:
+          displayed_strings.push_back(l10n_util::GetPluralStringFUTF16(
+              IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS, num_suggestions));
+          break;
+        case 1:
+          displayed_strings.push_back(l10n_util::GetPluralStringFUTF16(
+              IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_LONG, num_suggestions));
+          break;
+        case 2:
+          displayed_strings.push_back(l10n_util::GetPluralStringFUTF16(
+              IDS_DEL_AUTOFILL_COUNTER_SUGGESTIONS_SHORT, num_suggestions));
+          break;
+        default:
+          NOTREACHED();
+      }
+    }
+
+    // Construct the resulting string from the sections in |displayed_strings|.
+    switch (displayed_strings.size()) {
+      case 0:
+        text = l10n_util::GetStringUTF16(IDS_DEL_AUTOFILL_COUNTER_EMPTY);
+        break;
+      case 1:
+        text = displayed_strings[0];
+        break;
+      case 2:
+        text = l10n_util::GetStringFUTF16(IDS_DEL_AUTOFILL_COUNTER_TWO_TYPES,
+                                          displayed_strings[0],
+                                          displayed_strings[1]);
+        break;
+      case 3:
+        text = l10n_util::GetStringFUTF16(IDS_DEL_AUTOFILL_COUNTER_THREE_TYPES,
+                                          displayed_strings[0],
+                                          displayed_strings[1],
+                                          displayed_strings[2]);
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+
+  return text;
+}
+
 void ClearBrowserDataHandler::OnPageOpened(const base::ListValue* value) {
   for (BrowsingDataCounter* counter : counters_) {
     DCHECK(AreCountersEnabled());
@@ -321,65 +447,10 @@
 void ClearBrowserDataHandler::UpdateCounterText(
     scoped_ptr<BrowsingDataCounter::Result> result) {
   DCHECK(AreCountersEnabled());
-  base::string16 text;
-  std::string pref_name = result->source()->GetPrefName();
-
-  if (!result->Finished()) {
-    // The counter is still counting.
-    text = l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING);
-
-  } else if (pref_name == prefs::kDeletePasswords) {
-    // Passwords counter.
-    BrowsingDataCounter::ResultInt passwords_count =
-        static_cast<BrowsingDataCounter::FinishedResult*>(
-            result.get())->Value();
-    text = l10n_util::GetPluralStringFUTF16(
-        IDS_DEL_PASSWORDS_COUNTER, passwords_count);
-
-  } else if (pref_name == prefs::kDeleteCache) {
-    // Cache counter.
-    BrowsingDataCounter::ResultInt cache_size_bytes =
-        static_cast<BrowsingDataCounter::FinishedResult*>(
-            result.get())->Value();
-
-    PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
-    BrowsingDataRemover::TimePeriod time_period =
-        static_cast<BrowsingDataRemover::TimePeriod>(
-            prefs->GetInteger(prefs::kDeleteTimePeriod));
-
-    // Three cases: Nonzero result for the entire cache, nonzero result for
-    // a subset of cache (i.e. a finite time interval), and almost zero (< 1MB).
-    static const int kBytesInAMegabyte = 1024 * 1024;
-    if (cache_size_bytes >= kBytesInAMegabyte) {
-      base::string16 formatted_size = ui::FormatBytes(cache_size_bytes);
-      text = time_period == BrowsingDataRemover::EVERYTHING
-          ? formatted_size
-          : l10n_util::GetStringFUTF16(IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE,
-                                       formatted_size);
-    } else {
-      base::string16 formatted_size = ui::FormatBytes(kBytesInAMegabyte);
-      text = l10n_util::GetStringFUTF16(IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE,
-                                        formatted_size);
-    }
-
-  } else if (pref_name == prefs::kDeleteBrowsingHistory) {
-    // History counter.
-    HistoryCounter::HistoryResult* history_result =
-        static_cast<HistoryCounter::HistoryResult*>(result.get());
-    BrowsingDataCounter::ResultInt local_item_count = history_result->Value();
-    bool has_synced_visits = history_result->has_synced_visits();
-
-    text = has_synced_visits
-        ? l10n_util::GetPluralStringFUTF16(
-              IDS_DEL_BROWSING_HISTORY_COUNTER_SYNCED, local_item_count)
-        : l10n_util::GetPluralStringFUTF16(
-              IDS_DEL_BROWSING_HISTORY_COUNTER, local_item_count);
-  }
-
   web_ui()->CallJavascriptFunction(
       "ClearBrowserDataOverlay.updateCounter",
-      base::StringValue(pref_name),
-      base::StringValue(text));
+      base::StringValue(result->source()->GetPrefName()),
+      base::StringValue(GetCounterTextFromResult(result.get())));
 }
 
 void ClearBrowserDataHandler::OnStateChanged() {
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler.h b/chrome/browser/ui/webui/options/clear_browser_data_handler.h
index 32c9628..ea1e7dc 100644
--- a/chrome/browser/ui/webui/options/clear_browser_data_handler.h
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler.h
@@ -32,6 +32,10 @@
 
   void UpdateInfoBannerVisibility();
 
+  // Constructs the text to be displayed by a counter from the given |result|.
+  static base::string16 GetCounterTextFromResult(
+      const BrowsingDataCounter::Result* result);
+
  private:
   // Javascript callback for when the CBD dialog is opened. The caller does
   // not provide any parameters, so |value| is unused.
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler_unittest.cc b/chrome/browser/ui/webui/options/clear_browser_data_handler_unittest.cc
new file mode 100644
index 0000000..64792aa0
--- /dev/null
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler_unittest.cc
@@ -0,0 +1,64 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/options/clear_browser_data_handler.h"
+
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browsing_data/autofill_counter.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace options {
+
+// Tests the complex output of the Autofill counter.
+TEST(ClearBrowserDataTest, AutofillCounterResult) {
+  AutofillCounter counter;
+
+  // This test assumes that the strings are served exactly as defined,
+  // i.e. that the locale is set to the default "en".
+  ASSERT_EQ("en", TestingBrowserProcess::GetGlobal()->GetApplicationLocale());
+
+  // Test all configurations of zero and nonzero partial results for datatypes.
+  // Test singular and plural for each datatype.
+  struct TestCase {
+    int num_credit_cards;
+    int num_addresses;
+    int num_suggestions;
+    std::string expected_output;
+  } test_cases[] = {
+      {0, 0, 0, "none"},
+      {1, 0, 0, "1 credit card"},
+      {0, 5, 0, "5 addresses"},
+      {0, 0, 1, "1 suggestion"},
+      {0, 0, 2, "2 suggestions"},
+      {4, 7, 0, "4 credit cards, 7 addresses"},
+      {3, 0, 9, "3 credit cards, 9 other suggestions"},
+      {0, 1, 1, "1 address, 1 other suggestion"},
+      {9, 6, 3, "9 credit cards, 6 addresses, 3 others"},
+      {4, 2, 1, "4 credit cards, 2 addresses, 1 other"},
+  };
+
+  for (const TestCase& test_case : test_cases) {
+    AutofillCounter::AutofillResult result(
+        &counter,
+        test_case.num_suggestions,
+        test_case.num_credit_cards,
+        test_case.num_addresses);
+
+    SCOPED_TRACE(base::StringPrintf(
+        "Test params: %d credit card(s), "
+            "%d address(es), %d suggestion(s).",
+        test_case.num_credit_cards,
+        test_case.num_addresses,
+        test_case.num_suggestions
+    ));
+
+    base::string16 output = ClearBrowserDataHandler::GetCounterTextFromResult(
+        &result);
+    EXPECT_EQ(output, base::ASCIIToUTF16(test_case.expected_output));
+  }
+}
+
+}  // namespace options
diff --git a/chrome/browser/ui/webui/options/content_settings_handler.cc b/chrome/browser/ui/webui/options/content_settings_handler.cc
index 7f0f3a6..10ce23a 100644
--- a/chrome/browser/ui/webui/options/content_settings_handler.cc
+++ b/chrome/browser/ui/webui/options/content_settings_handler.cc
@@ -13,6 +13,7 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/prefs/pref_service.h"
+#include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
@@ -71,32 +72,10 @@
 namespace {
 
 struct ContentSettingWithExceptions {
-  ContentSettingsType type;
+  ContentSettingWithExceptions(bool otr, UserMetricsAction action)
+      : has_otr_exceptions(otr), uma(action) {}
   bool has_otr_exceptions;
-};
-
-const ContentSettingWithExceptions kContentTypesWithExceptions[] = {
-    // With OTR exceptions.
-    {CONTENT_SETTINGS_TYPE_COOKIES, true},
-    {CONTENT_SETTINGS_TYPE_IMAGES, true},
-    {CONTENT_SETTINGS_TYPE_JAVASCRIPT, true},
-    {CONTENT_SETTINGS_TYPE_PLUGINS, true},
-    {CONTENT_SETTINGS_TYPE_POPUPS, true},
-    {CONTENT_SETTINGS_TYPE_FULLSCREEN, true},
-    {CONTENT_SETTINGS_TYPE_MOUSELOCK, true},
-    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, true},
-    {CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, true},
-#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
-    {CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, true},
-#endif
-
-    // Without OTR exceptions.
-    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, false},
-    {CONTENT_SETTINGS_TYPE_GEOLOCATION, false},
-    {CONTENT_SETTINGS_TYPE_NOTIFICATIONS, false},
-    {CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, false},
-    {CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, false},
-    {CONTENT_SETTINGS_TYPE_MIDI_SYSEX, false},
+  UserMetricsAction uma;
 };
 
 struct ContentSettingsTypeNameEntry {
@@ -159,6 +138,101 @@
 // though it is not a real content setting.
 const char kZoomContentType[] = "zoomlevels";
 
+// Maps from a content settings type to a content setting with exceptions
+// struct.
+typedef std::map<ContentSettingsType, ContentSettingWithExceptions>
+    ExceptionsInfoMap;
+
+const ExceptionsInfoMap& GetExceptionsInfoMap() {
+  CR_DEFINE_STATIC_LOCAL(ExceptionsInfoMap, exceptions_info_map, ());
+  if (exceptions_info_map.empty()) {
+    // With OTR exceptions.
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_COOKIES,
+        ContentSettingWithExceptions(
+            true, UserMetricsAction("Options_DefaultCookieSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_IMAGES,
+        ContentSettingWithExceptions(
+            true, UserMetricsAction("Options_DefaultImagesSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_JAVASCRIPT,
+        ContentSettingWithExceptions(
+            true,
+            UserMetricsAction("Options_DefaultJavaScriptSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_PLUGINS,
+        ContentSettingWithExceptions(
+            true, UserMetricsAction("Options_DefaultPluginsSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_POPUPS,
+        ContentSettingWithExceptions(
+            true, UserMetricsAction("Options_DefaultPopupsSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_FULLSCREEN,
+        ContentSettingWithExceptions(
+            true,
+            UserMetricsAction("Options_DefaultFullScreenSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_MOUSELOCK,
+        ContentSettingWithExceptions(
+            true,
+            UserMetricsAction("Options_DefaultMouseLockSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
+        ContentSettingWithExceptions(
+            true,
+            UserMetricsAction("Options_DefaultPPAPIBrokerSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_PUSH_MESSAGING,
+        ContentSettingWithExceptions(
+            true,
+            UserMetricsAction("Options_DefaultPushMessagingSettingChanged"))));
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER,
+        ContentSettingWithExceptions(
+            true,
+            UserMetricsAction(
+                "Options_DefaultProtectedMediaIdentifierSettingChanged"))));
+#endif
+
+    // Without OTR exceptions.
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+        ContentSettingWithExceptions(
+            false,
+            UserMetricsAction("Options_DefaultNotificationsSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_GEOLOCATION,
+        ContentSettingWithExceptions(
+            false,
+            UserMetricsAction("Options_DefaultGeolocationSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
+        ContentSettingWithExceptions(
+            false,
+            UserMetricsAction("Options_DefaultMediaStreamMicSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
+        ContentSettingWithExceptions(
+            false, UserMetricsAction(
+                       "Options_DefaultMediaStreamCameraSettingChanged"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+        ContentSettingWithExceptions(
+            false, UserMetricsAction(
+                       "Options_DefaultMultipleAutomaticDLSettingChange"))));
+    exceptions_info_map.insert(std::make_pair(
+        CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
+        ContentSettingWithExceptions(
+            false,
+            UserMetricsAction("Options_DefaultMIDISysExSettingChanged"))));
+  }
+
+  return exceptions_info_map;
+}
+
 content::BrowserContext* GetBrowserContext(content::WebUI* web_ui) {
   return web_ui->GetWebContents()->GetBrowserContext();
 }
@@ -639,13 +713,8 @@
   if (details.update_all_types()) {
     UpdateAllExceptionsViewsFromModel();
   } else {
-    for (ContentSettingWithExceptions content_setting_with_exceptions :
-         kContentTypesWithExceptions) {
-      if (content_setting_with_exceptions.type == details.type()) {
-        UpdateExceptionsViewFromModel(details.type());
-        break;
-      }
-    }
+    if (ContainsKey(GetExceptionsInfoMap(), details.type()))
+      UpdateExceptionsViewFromModel(details.type());
   }
 }
 
@@ -773,21 +842,21 @@
 }
 
 void ContentSettingsHandler::UpdateAllExceptionsViewsFromModel() {
-  for (ContentSettingWithExceptions content_setting_with_exceptions :
-       kContentTypesWithExceptions) {
-    UpdateExceptionsViewFromModel(content_setting_with_exceptions.type);
-  }
+  const ExceptionsInfoMap& exceptions_info_map = GetExceptionsInfoMap();
+  for (const auto& exceptions_info_pair : exceptions_info_map)
+    UpdateExceptionsViewFromModel(exceptions_info_pair.first);
+
   // Zoom levels are not actually a content type so we need to handle them
   // separately.
   UpdateZoomLevelsExceptionsView();
 }
 
 void ContentSettingsHandler::UpdateAllOTRExceptionsViewsFromModel() {
-  for (ContentSettingWithExceptions content_setting_with_exceptions :
-       kContentTypesWithExceptions) {
-    if (content_setting_with_exceptions.has_otr_exceptions) {
+  const ExceptionsInfoMap& exceptions_info_map = GetExceptionsInfoMap();
+  for (const auto& exceptions_info_pair : exceptions_info_map) {
+    if (exceptions_info_pair.second.has_otr_exceptions) {
       UpdateExceptionsViewFromOTRHostContentSettingsMap(
-          content_setting_with_exceptions.type);
+          exceptions_info_pair.first);
     }
   }
 }
@@ -1373,62 +1442,10 @@
   DCHECK_NE(CONTENT_SETTINGS_TYPE_MEDIASTREAM, content_type);
   map->SetDefaultContentSetting(content_type, default_setting);
 
-  switch (content_type) {
-    case CONTENT_SETTINGS_TYPE_COOKIES:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultCookieSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_IMAGES:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultImagesSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_JAVASCRIPT:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultJavaScriptSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_PLUGINS:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultPluginsSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_POPUPS:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultPopupsSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultNotificationsSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultGeolocationSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_MOUSELOCK:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultMouseLockSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultMediaStreamMicSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultMediaStreamCameraSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultMultipleAutomaticDLSettingChange"));
-      break;
-    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultMIDISysExSettingChanged"));
-      break;
-    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
-      content::RecordAction(
-          UserMetricsAction("Options_DefaultPushMessagingSettingChanged"));
-      break;
-    default:
-      break;
-  }
+  const ExceptionsInfoMap& exceptions_info_map = GetExceptionsInfoMap();
+  const auto& it = exceptions_info_map.find(content_type);
+  if (it != exceptions_info_map.end())
+    content::RecordAction(it->second.uma);
 }
 
 void ContentSettingsHandler::RemoveException(const base::ListValue* args) {
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index 11ed3f5ef..d19a0955 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.h"
 
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h"
 #include "chrome/common/url_constants.h"
@@ -15,6 +16,7 @@
 #include "chrome/grit/settings_chromium_strings.h"
 #include "chrome/grit/settings_google_chrome_strings.h"
 #include "chrome/grit/settings_strings.h"
+#include "components/google/core/browser/google_util.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -534,6 +536,24 @@
 }
 
 void AddSyncStrings(content::WebUIDataSource* html_source) {
+  html_source->AddLocalizedString("syncDisconnect",
+                                  IDS_SETTINGS_SYNC_DISCONNECT);
+  html_source->AddLocalizedString("syncDisconnectTitle",
+                                  IDS_SETTINGS_SYNC_DISCONNECT_TITLE);
+  std::string disconnect_help_url =
+      google_util::AppendGoogleLocaleParam(
+          GURL(chrome::kSyncGoogleDashboardURL),
+          g_browser_process->GetApplicationLocale())
+          .spec();
+  html_source->AddString(
+      "syncDisconnectExplanation",
+      l10n_util::GetStringFUTF16(IDS_SYNC_STOP_SYNCING_EXPLANATION_LABEL,
+                                 base::ASCIIToUTF16(disconnect_help_url)));
+  html_source->AddLocalizedString("syncDisconnectDeleteProfile",
+                                  IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE);
+  html_source->AddLocalizedString("syncDisconnectConfirm",
+                                  IDS_SETTINGS_SYNC_DISCONNECT_CONFIRM);
+
   html_source->AddLocalizedString("syncPageTitle", IDS_SETTINGS_SYNC);
   html_source->AddLocalizedString("syncLoading", IDS_SETTINGS_SYNC_LOADING);
   html_source->AddLocalizedString("syncTimeout", IDS_SETTINGS_SYNC_TIMEOUT);
@@ -594,7 +614,6 @@
   html_source->AddLocalizedString(
       "passphraseConfirmationPlaceholder",
       IDS_SETTINGS_PASSPHRASE_CONFIRMATION_PLACEHOLDER);
-
 }
 
 void AddUsersStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc
index 39caf0a..235a1021 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -40,7 +40,7 @@
   AddSettingsPageUIHandler(new FontHandler(web_ui));
   AddSettingsPageUIHandler(new LanguagesHandler(web_ui));
   AddSettingsPageUIHandler(new StartupPagesHandler(web_ui));
-  AddSettingsPageUIHandler(new SyncHandler());
+  AddSettingsPageUIHandler(new SyncHandler(Profile::FromWebUI(web_ui)));
 
   content::WebUIDataSource* html_source =
       content::WebUIDataSource::Create(chrome::kChromeUIMdSettingsHost);
diff --git a/chrome/browser/ui/webui/settings/sync_handler.cc b/chrome/browser/ui/webui/settings/sync_handler.cc
index 02a70cb..2292260e 100644
--- a/chrome/browser/ui/webui/settings/sync_handler.cc
+++ b/chrome/browser/ui/webui/settings/sync_handler.cc
@@ -24,6 +24,7 @@
 #include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/signin/signin_promo.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/sync/sync_ui_util.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/singleton_tabs.h"
@@ -37,6 +38,7 @@
 #include "components/signin/core/browser/signin_header_helper.h"
 #include "components/signin/core/browser/signin_metrics.h"
 #include "components/signin/core/common/profile_management_switches.h"
+#include "components/signin/core/common/signin_pref_names.h"
 #include "components/sync_driver/sync_prefs.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
@@ -146,7 +148,20 @@
 
 namespace settings {
 
-SyncHandler::SyncHandler() : configuring_sync_(false) {
+SyncHandler::SyncHandler(Profile* profile)
+    : profile_(profile),
+      configuring_sync_(false),
+      sync_service_observer_(this) {
+  PrefService* prefs = profile_->GetPrefs();
+  profile_pref_registrar_.Init(prefs);
+  profile_pref_registrar_.Add(
+      prefs::kSigninAllowed, base::Bind(&SyncHandler::OnSigninAllowedPrefChange,
+                                        base::Unretained(this)));
+
+  ProfileSyncService* sync_service(
+      ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_));
+  if (sync_service)
+    sync_service_observer_.Add(sync_service);
 }
 
 SyncHandler::~SyncHandler() {
@@ -160,18 +175,18 @@
 
 void SyncHandler::ConfigureSyncDone() {
   base::StringValue page("done");
-  web_ui()->CallJavascriptFunction(
-      "SyncSetupOverlay.showSyncSetupPage", page);
+  web_ui()->CallJavascriptFunction("settings.SyncPrivateApi.showSyncSetupPage",
+                                   page);
 
   // Suppress the sign in promo once the user starts sync. This way the user
   // doesn't see the sign in promo even if they sign out later on.
-  signin::SetUserSkippedPromo(GetProfile());
+  signin::SetUserSkippedPromo(profile_);
 
   ProfileSyncService* service = GetSyncService();
   DCHECK(service);
   if (!service->HasSyncSetupCompleted()) {
     // This is the first time configuring sync, so log it.
-    base::FilePath profile_file_path = GetProfile()->GetPath();
+    base::FilePath profile_file_path = profile_->GetPath();
     ProfileMetrics::LogProfileSyncSignIn(profile_file_path);
 
     // We're done configuring, so notify ProfileSyncService that it is OK to
@@ -182,7 +197,7 @@
 }
 
 bool SyncHandler::IsActiveLogin() const {
-  // LoginUIService can be NULL if page is brought up in incognito mode
+  // LoginUIService can be nullptr if page is brought up in incognito mode
   // (i.e. if the user is running in guest mode in cros and brings up settings).
   LoginUIService* service = GetLoginUIService();
   return service && (service->current_login_ui() == this);
@@ -201,9 +216,12 @@
       "SyncSetupShowSetupUI",
       base::Bind(&SyncHandler::HandleShowSetupUI,
                  base::Unretained(this)));
-  web_ui()->RegisterMessageCallback("CloseTimeout",
-      base::Bind(&SyncHandler::HandleCloseTimeout,
-                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "SyncSetupCloseTimeout",
+      base::Bind(&SyncHandler::HandleCloseTimeout, base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "SyncSetupGetSyncStatus",
+      base::Bind(&SyncHandler::HandleGetSyncStatus, base::Unretained(this)));
 #if defined(OS_CHROMEOS)
   web_ui()->RegisterMessageCallback(
       "SyncSetupDoSignOutOnAuthError",
@@ -235,8 +253,8 @@
   bool force_new_tab = false;
   if (!browser) {
     // Settings is not displayed in a browser window. Open a new window.
-    browser = new Browser(Browser::CreateParams(
-        Browser::TYPE_TABBED, GetProfile(), chrome::GetActiveDesktop()));
+    browser = new Browser(Browser::CreateParams(Browser::TYPE_TABBED, profile_,
+                                                chrome::GetActiveDesktop()));
     force_new_tab = true;
   }
 
@@ -307,8 +325,8 @@
                               base::TimeDelta::FromSeconds(kTimeoutSec),
                               this, &SyncHandler::DisplayTimeout);
 
-  web_ui()->CallJavascriptFunction(
-      "SyncSetupOverlay.showSyncSetupPage", page, args);
+  web_ui()->CallJavascriptFunction("settings.SyncPrivateApi.showSyncSetupPage",
+                                   page, args);
 }
 
 // TODO(kochi): Handle error conditions other than timeout.
@@ -322,8 +340,8 @@
 
   base::StringValue page("timeout");
   base::DictionaryValue args;
-  web_ui()->CallJavascriptFunction(
-      "SyncSetupOverlay.showSyncSetupPage", page, args);
+  web_ui()->CallJavascriptFunction("settings.SyncPrivateApi.showSyncSetupPage",
+                                   page, args);
 }
 
 void SyncHandler::OnDidClosePage(const base::ListValue* args) {
@@ -349,13 +367,10 @@
   DisplayConfigureSync(false);
 }
 
-Profile* SyncHandler::GetProfile() const {
-  return Profile::FromWebUI(web_ui());
-}
-
 ProfileSyncService* SyncHandler::GetSyncService() const {
-  return GetProfile()->IsSyncAllowed() ?
-      ProfileSyncServiceFactory::GetForProfile(GetProfile()) : NULL;
+  return profile_->IsSyncAllowed()
+             ? ProfileSyncServiceFactory::GetForProfile(profile_)
+             : nullptr;
 }
 
 void SyncHandler::HandleConfigure(const base::ListValue* args) {
@@ -483,13 +498,11 @@
 
 void SyncHandler::HandleShowSetupUI(const base::ListValue* args) {
   if (!GetSyncService()) {
-    DLOG(WARNING) << "Cannot display sync UI when sync is disabled";
     CloseUI();
     return;
   }
 
-  SigninManagerBase* signin =
-      SigninManagerFactory::GetForProfile(GetProfile());
+  SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile_);
   if (!signin->IsAuthenticated()) {
     // For web-based signin, the signin page is not displayed in an overlay
     // on the settings page. So if we get here, it must be due to the user
@@ -527,21 +540,20 @@
 #if !defined(OS_CHROMEOS)
 void SyncHandler::HandleStartSignin(const base::ListValue* args) {
   // Should only be called if the user is not already signed in.
-  DCHECK(!SigninManagerFactory::GetForProfile(GetProfile())->
-      IsAuthenticated());
+  DCHECK(!SigninManagerFactory::GetForProfile(profile_)->IsAuthenticated());
   OpenSyncSetup();
 }
 
 void SyncHandler::HandleStopSyncing(const base::ListValue* args) {
   if (GetSyncService())
     ProfileSyncService::SyncEvent(ProfileSyncService::STOP_FROM_OPTIONS);
-  SigninManagerFactory::GetForProfile(GetProfile())->SignOut(
-      signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS);
+  SigninManagerFactory::GetForProfile(profile_)
+      ->SignOut(signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS);
 
   bool delete_profile = false;
   if (args->GetBoolean(0, &delete_profile) && delete_profile) {
     // Do as BrowserOptionsHandler::DeleteProfile().
-    options::helper::DeleteProfileAtPath(GetProfile()->GetPath(), web_ui());
+    options::helper::DeleteProfileAtPath(profile_->GetPath(), web_ui());
   }
 }
 #endif
@@ -550,6 +562,10 @@
   CloseSyncSetup();
 }
 
+void SyncHandler::HandleGetSyncStatus(const base::ListValue* /* args */) {
+  UpdateSyncState();
+}
+
 void SyncHandler::CloseSyncSetup() {
   // Stop a timer to handle timeout in waiting for checking network connection.
   backend_start_timer_.reset();
@@ -581,8 +597,8 @@
           // initial setup.
           // TODO(rsimha): Revisit this for M30. See http://crbug.com/252049.
           if (sync_service->IsFirstSetupInProgress()) {
-            SigninManagerFactory::GetForProfile(GetProfile())->SignOut(
-                signin_metrics::ABORT_SIGNIN);
+            SigninManagerFactory::GetForProfile(profile_)
+                ->SignOut(signin_metrics::ABORT_SIGNIN);
           }
   #endif
         }
@@ -617,11 +633,10 @@
   //    sync configure UI, not login UI).
   // 7) User re-enables sync after disabling it via advanced settings.
 #if !defined(OS_CHROMEOS)
-  SigninManagerBase* signin =
-      SigninManagerFactory::GetForProfile(GetProfile());
+  SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile_);
 
   if (!signin->IsAuthenticated() ||
-      SigninErrorControllerFactory::GetForProfile(GetProfile())->HasError()) {
+      SigninErrorControllerFactory::GetForProfile(profile_)->HasError()) {
     // User is not logged in (cases 1-2), or login has been specially requested
     // because previously working credentials have expired (case 3). Close sync
     // setup including any visible overlays, and display the gaia auth page.
@@ -660,14 +675,82 @@
 void SyncHandler::CloseUI() {
   CloseSyncSetup();
   base::StringValue page("done");
-  web_ui()->CallJavascriptFunction(
-      "SyncSetupOverlay.showSyncSetupPage", page);
+  web_ui()->CallJavascriptFunction("settings.SyncPrivateApi.showSyncSetupPage",
+                                   page);
+}
+
+void SyncHandler::GoogleSigninSucceeded(const std::string& /* account_id */,
+                                        const std::string& /* username */,
+                                        const std::string& /* password */) {
+  UpdateSyncState();
+}
+
+void SyncHandler::GoogleSignedOut(const std::string& /* account_id */,
+                                  const std::string& /* username */) {
+  UpdateSyncState();
+}
+
+void SyncHandler::OnStateChanged() {
+  UpdateSyncState();
+}
+
+scoped_ptr<base::DictionaryValue> SyncHandler::GetSyncStateDictionary() {
+  // The items which are to be written into |sync_status| are also described in
+  // chrome/browser/resources/options/browser_options.js in @typedef
+  // for SyncStatus. Please update it whenever you add or remove any keys here.
+  scoped_ptr<base::DictionaryValue> sync_status(new base::DictionaryValue);
+  if (profile_->IsGuestSession()) {
+    // Cannot display signin status when running in guest mode on chromeos
+    // because there is no SigninManager.
+    sync_status->SetBoolean("signinAllowed", false);
+    return sync_status.Pass();
+  }
+
+  sync_status->SetBoolean("supervisedUser", profile_->IsSupervised());
+  sync_status->SetBoolean("childUser", profile_->IsChild());
+
+  bool signout_prohibited = false;
+#if !defined(OS_CHROMEOS)
+  // Signout is not allowed if the user has policy (crbug.com/172204).
+  signout_prohibited =
+      SigninManagerFactory::GetForProfile(profile_)->IsSignoutProhibited();
+#endif
+
+  ProfileSyncService* service =
+      ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
+  SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile_);
+  DCHECK(signin);
+  sync_status->SetBoolean("signoutAllowed", !signout_prohibited);
+  sync_status->SetBoolean("signinAllowed", signin->IsSigninAllowed());
+  sync_status->SetBoolean("syncSystemEnabled", (service != nullptr));
+  sync_status->SetBoolean("setupCompleted",
+                          service && service->HasSyncSetupCompleted());
+  sync_status->SetBoolean(
+      "setupInProgress",
+      service && !service->IsManaged() && service->IsFirstSetupInProgress());
+
+  base::string16 status_label;
+  base::string16 link_label;
+  bool status_has_error =
+      sync_ui_util::GetStatusLabels(profile_, service, *signin,
+                                    sync_ui_util::WITH_HTML, &status_label,
+                                    &link_label) == sync_ui_util::SYNC_ERROR;
+  sync_status->SetString("statusText", status_label);
+  sync_status->SetString("actionLinkText", link_label);
+  sync_status->SetBoolean("hasError", status_has_error);
+
+  sync_status->SetBoolean("managed", service && service->IsManaged());
+  sync_status->SetBoolean("signedIn", signin->IsAuthenticated());
+  sync_status->SetBoolean("hasUnrecoverableError",
+                          service && service->HasUnrecoverableError());
+
+  return sync_status.Pass();
 }
 
 bool SyncHandler::IsExistingWizardPresent() {
   LoginUIService* service = GetLoginUIService();
   DCHECK(service);
-  return service->current_login_ui() != NULL;
+  return service->current_login_ui() != nullptr;
 }
 
 bool SyncHandler::FocusExistingWizardIfPresent() {
@@ -682,8 +765,7 @@
 
 void SyncHandler::DisplayConfigureSync(bool passphrase_failed) {
   // Should never call this when we are not signed in.
-  DCHECK(SigninManagerFactory::GetForProfile(
-      GetProfile())->IsAuthenticated());
+  DCHECK(SigninManagerFactory::GetForProfile(profile_)->IsAuthenticated());
   ProfileSyncService* service = GetSyncService();
   DCHECK(service);
   if (!service->IsBackendInitialized()) {
@@ -693,14 +775,13 @@
     // (unrecoverable error?), don't bother displaying a spinner that will be
     // immediately closed because this leads to some ugly infinite UI loop (see
     // http://crbug.com/244769).
-    if (SyncStartupTracker::GetSyncServiceState(GetProfile()) !=
+    if (SyncStartupTracker::GetSyncServiceState(profile_) !=
         SyncStartupTracker::SYNC_STARTUP_ERROR) {
       DisplaySpinner();
     }
 
     // Start SyncSetupTracker to wait for sync to initialize.
-    sync_startup_tracker_.reset(
-        new SyncStartupTracker(GetProfile(), this));
+    sync_startup_tracker_.reset(new SyncStartupTracker(profile_, this));
     return;
   }
 
@@ -739,7 +820,7 @@
     // TODO(treib): How do we want to handle pref groups, i.e. when only some of
     // the sync types behind a checkbox are force-enabled? crbug.com/403326
   }
-  sync_driver::SyncPrefs sync_prefs(GetProfile()->GetPrefs());
+  sync_driver::SyncPrefs sync_prefs(profile_->GetPrefs());
   args.SetBoolean("passphraseFailed", passphrase_failed);
   args.SetBoolean("syncAllDataTypes", sync_prefs.HasKeepEverythingSynced());
   args.SetBoolean("syncNothing", false);  // Always false during initial setup.
@@ -799,8 +880,8 @@
   }
 
   base::StringValue page("configure");
-  web_ui()->CallJavascriptFunction(
-      "SyncSetupOverlay.showSyncSetupPage", page, args);
+  web_ui()->CallJavascriptFunction("settings.SyncPrivateApi.showSyncSetupPage",
+                                   page, args);
 
   // Make sure the tab used for the Gaia sign in does not cover the settings
   // tab.
@@ -808,7 +889,16 @@
 }
 
 LoginUIService* SyncHandler::GetLoginUIService() const {
-  return LoginUIServiceFactory::GetForProfile(GetProfile());
+  return LoginUIServiceFactory::GetForProfile(profile_);
+}
+
+void SyncHandler::UpdateSyncState() {
+  web_ui()->CallJavascriptFunction("settings.SyncPrivateApi.sendSyncStatus",
+                                   *GetSyncStateDictionary());
+}
+
+void SyncHandler::OnSigninAllowedPrefChange() {
+  UpdateSyncState();
 }
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/sync_handler.h b/chrome/browser/ui/webui/settings/sync_handler.h
index 8a30626..9ac84ba 100644
--- a/chrome/browser/ui/webui/settings/sync_handler.h
+++ b/chrome/browser/ui/webui/settings/sync_handler.h
@@ -8,9 +8,13 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/prefs/pref_change_registrar.h"
+#include "base/scoped_observer.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/sync/sync_startup_tracker.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
+#include "components/signin/core/browser/signin_manager_base.h"
+#include "components/sync_driver/sync_service_observer.h"
 #include "content/public/browser/web_ui_message_handler.h"
 
 class LoginUIService;
@@ -25,16 +29,18 @@
 namespace settings {
 
 class SyncHandler : public content::WebUIMessageHandler,
+                    public SigninManagerBase::Observer,
                     public SyncStartupTracker::Observer,
-                    public LoginUIService::LoginUI {
+                    public LoginUIService::LoginUI,
+                    public sync_driver::SyncServiceObserver {
  public:
-  SyncHandler();
+  explicit SyncHandler(Profile* profile);
   ~SyncHandler() override;
 
   // content::WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  // SyncStartupTracker::Observer implementation;
+  // SyncStartupTracker::Observer implementation.
   void SyncStartupCompleted() override;
   void SyncStartupFailed() override;
 
@@ -42,6 +48,16 @@
   void FocusUI() override;
   void CloseUI() override;
 
+  // SigninManagerBase::Observer implementation.
+  void GoogleSigninSucceeded(const std::string& account_id,
+                             const std::string& username,
+                             const std::string& password) override;
+  void GoogleSignedOut(const std::string& account_id,
+                       const std::string& username) override;
+
+  // sync_driver::SyncServiceObserver implementation.
+  void OnStateChanged() override;
+
   // Initializes the sync setup flow and shows the setup UI.
   void OpenSyncSetup();
 
@@ -53,6 +69,10 @@
   // Terminates the sync setup flow.
   void CloseSyncSetup();
 
+  // Returns a newly created dictionary with a number of properties that
+  // correspond to the status of sync.
+  scoped_ptr<base::DictionaryValue> GetSyncStateDictionary();
+
  protected:
   friend class SyncHandlerTest;
   FRIEND_TEST_ALL_PREFIXES(SyncHandlerTest,
@@ -102,6 +122,8 @@
   void HandleStartSignin(const base::ListValue* args);
   void HandleStopSyncing(const base::ListValue* args);
   void HandleCloseTimeout(const base::ListValue* args);
+  void HandleGetSyncStatus(const base::ListValue* args);
+
 #if !defined(OS_CHROMEOS)
   // Displays the GAIA login form.
   void DisplayGaiaLogin();
@@ -111,10 +133,6 @@
   virtual void DisplayGaiaLoginInNewTabOrWindow();
 #endif
 
-  // Helper routine that gets the Profile associated with this object (virtual
-  // so tests can override).
-  virtual Profile* GetProfile() const;
-
   // A utility function to call before actually showing setup dialog. Makes sure
   // that a new dialog can be shown and sets flag that setup is in progress.
   bool PrepareSyncSetup();
@@ -141,6 +159,15 @@
   // requires a passphrase and one hasn't been provided or it was invalid.
   void DisplayConfigureSync(bool passphrase_failed);
 
+  // Sends the current sync status to the JavaScript WebUI code.
+  void UpdateSyncState();
+
+  // Will be called when the kSigninAllowed pref has changed.
+  void OnSigninAllowedPrefChange();
+
+  // Weak pointer.
+  Profile* profile_;
+
   // Helper object used to wait for the sync backend to startup.
   scoped_ptr<SyncStartupTracker> sync_startup_tracker_;
 
@@ -153,6 +180,12 @@
   // service.
   scoped_ptr<base::OneShotTimer> backend_start_timer_;
 
+  // Used to listen for pref changes to allow or disallow signin.
+  PrefChangeRegistrar profile_pref_registrar_;
+
+  // Manages observer lifetime.
+  ScopedObserver<ProfileSyncService, SyncHandler> sync_service_observer_;
+
   DISALLOW_COPY_AND_ASSIGN(SyncHandler);
 };
 
diff --git a/chrome/browser/ui/webui/settings/sync_handler_unittest.cc b/chrome/browser/ui/webui/settings/sync_handler_unittest.cc
index 8638d32..d647b09 100644
--- a/chrome/browser/ui/webui/settings/sync_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/sync_handler_unittest.cc
@@ -151,15 +151,17 @@
 class TestingSyncHandler : public SyncHandler {
  public:
   TestingSyncHandler(content::WebUI* web_ui, Profile* profile)
-      : profile_(profile) {
+      : SyncHandler(profile) {
     set_web_ui(web_ui);
   }
-  ~TestingSyncHandler() override { set_web_ui(nullptr); }
+  ~TestingSyncHandler() override {
+    // TODO(tommycli): SyncHandler needs this call to destruct properly in the
+    // unit testing context. See the destructor to SyncHandler. This is hacky.
+    set_web_ui(nullptr);
+  }
 
   void FocusUI() override {}
 
-  Profile* GetProfile() const override { return profile_; }
-
   using SyncHandler::is_configuring_sync;
 
  private:
@@ -167,8 +169,6 @@
   void DisplayGaiaLoginInNewTabOrWindow() override {}
 #endif
 
-  // Weak pointer to parent profile.
-  Profile* profile_;
   DISALLOW_COPY_AND_ASSIGN(TestingSyncHandler);
 };
 
@@ -238,7 +238,8 @@
   void ExpectConfig() {
     ASSERT_EQ(1U, web_ui_.call_data().size());
     const content::TestWebUI::CallData& data = *web_ui_.call_data()[0];
-    EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name());
+    EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage",
+              data.function_name());
     std::string page;
     ASSERT_TRUE(data.arg1()->GetAsString(&page));
     EXPECT_EQ(page, "configure");
@@ -247,17 +248,19 @@
   void ExpectDone() {
     ASSERT_EQ(1U, web_ui_.call_data().size());
     const content::TestWebUI::CallData& data = *web_ui_.call_data()[0];
-    EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name());
+    EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage",
+              data.function_name());
     std::string page;
     ASSERT_TRUE(data.arg1()->GetAsString(&page));
     EXPECT_EQ(page, "done");
   }
 
   void ExpectSpinnerAndClose() {
-    // We expect a call to SyncSetupOverlay.showSyncSetupPage.
+    // We expect a call to settings.SyncPrivateApi.showSyncSetupPage.
     EXPECT_EQ(1U, web_ui_.call_data().size());
     const content::TestWebUI::CallData& data = *web_ui_.call_data()[0];
-    EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name());
+    EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage",
+              data.function_name());
 
     std::string page;
     ASSERT_TRUE(data.arg1()->GetAsString(&page));
@@ -330,10 +333,10 @@
       .WillRepeatedly(Return(false));
   handler_->HandleShowSetupUI(NULL);
 
-  // We expect a call to SyncSetupOverlay.showSyncSetupPage.
+  // We expect a call to settings.SyncPrivateApi.showSyncSetupPage.
   ASSERT_EQ(1U, web_ui_.call_data().size());
   const content::TestWebUI::CallData& data = *web_ui_.call_data()[0];
-  EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name());
+  EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage", data.function_name());
 
   ASSERT_FALSE(handler_->is_configuring_sync());
   EXPECT_EQ(NULL,
@@ -396,11 +399,11 @@
 
   handler_->OpenSyncSetup();
 
-  // We expect a call to SyncSetupOverlay.showSyncSetupPage.
+  // We expect a call to settings.SyncPrivateApi.showSyncSetupPage.
   EXPECT_EQ(1U, web_ui_.call_data().size());
 
   const content::TestWebUI::CallData& data0 = *web_ui_.call_data()[0];
-  EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data0.function_name());
+  EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage", data0.function_name());
   std::string page;
   ASSERT_TRUE(data0.arg1()->GetAsString(&page));
   EXPECT_EQ(page, "spinner");
@@ -413,10 +416,10 @@
   EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error_));
   NotifySyncListeners();
 
-  // We expect a second call to SyncSetupOverlay.showSyncSetupPage.
+  // We expect a second call to settings.SyncPrivateApi.showSyncSetupPage.
   EXPECT_EQ(2U, web_ui_.call_data().size());
   const content::TestWebUI::CallData& data1 = *web_ui_.call_data().back();
-  EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data1.function_name());
+  EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage", data1.function_name());
   ASSERT_TRUE(data1.arg1()->GetAsString(&page));
   EXPECT_EQ(page, "configure");
   const base::DictionaryValue* dictionary = nullptr;
@@ -471,7 +474,7 @@
 
   handler_->OpenSyncSetup();
   const content::TestWebUI::CallData& data = *web_ui_.call_data()[0];
-  EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name());
+  EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage", data.function_name());
   std::string page;
   ASSERT_TRUE(data.arg1()->GetAsString(&page));
   EXPECT_EQ(page, "spinner");
@@ -562,10 +565,10 @@
   SetupInitializedProfileSyncService();
   handler_->HandleConfigure(&list_args);
 
-  // We expect a call to SyncSetupOverlay.showSyncSetupPage.
+  // We expect a call to settings.SyncPrivateApi.showSyncSetupPage.
   ASSERT_EQ(1U, web_ui_.call_data().size());
   const content::TestWebUI::CallData& data = *web_ui_.call_data()[0];
-  EXPECT_EQ("SyncSetupOverlay.showSyncSetupPage", data.function_name());
+  EXPECT_EQ("settings.SyncPrivateApi.showSyncSetupPage", data.function_name());
 }
 
 TEST_F(SyncHandlerTest, TurnOnEncryptAll) {
diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
index 0f9189b..c154837 100644
--- a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
+++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
@@ -22,10 +22,11 @@
 // GoogleSigninSucceeded or a GoogleSigninFailed notification is fired.
 class SignInObserver : public SigninTracker::Observer {
  public:
-  SignInObserver()
+  explicit SignInObserver(bool wait_for_account_cookies)
       : seen_(false),
         running_(false),
-        signed_in_(false) {}
+        signed_in_(false),
+        wait_for_account_cookies_(wait_for_account_cookies) {}
 
   virtual ~SignInObserver() {}
 
@@ -48,19 +49,31 @@
 
   void SigninFailed(const GoogleServiceAuthError& error) override {
     DVLOG(1) << "Google signin failed.";
-    seen_ = true;
-    if (!running_)
-      return;
-    message_loop_runner_->Quit();
-    running_ = false;
+    QuitLoopRunner();
   }
 
-  void AccountAddedToCookie(const GoogleServiceAuthError& error) override {}
+  void AccountAddedToCookie(const GoogleServiceAuthError& error) override {
+    if (!wait_for_account_cookies_)
+      return;
+    if (error.state() != GoogleServiceAuthError::NONE) {
+      DVLOG(1) << "Error signing the account, error " << error.state();
+    } else {
+      DVLOG(1) << "Account cookies are added to cookie jar.";
+      signed_in_ = true;
+    }
+    QuitLoopRunner();
+  }
 
   void SigninSuccess() override {
     DVLOG(1) << "Google signin succeeded.";
-    seen_ = true;
+    if (wait_for_account_cookies_)
+      return;
     signed_in_ = true;
+    QuitLoopRunner();
+  }
+
+  void QuitLoopRunner() {
+    seen_ = true;
     if (!running_)
       return;
     message_loop_runner_->Quit();
@@ -75,6 +88,10 @@
   bool running_;
   // True if a GoogleSigninSucceeded event has been observed.
   bool signed_in_;
+  // Whether we should block until the account cookies are added or not.
+  // If false, we only wait until SigninSuccess event is fired which happens
+  // prior to adding account to cookie.
+  bool wait_for_account_cookies_;
   scoped_refptr<MessageLoopRunner> message_loop_runner_;
 };
 
@@ -187,15 +204,15 @@
 
 bool SignInWithUI(Browser* browser,
                   const std::string& username,
-                  const std::string& password) {
-
-  SignInObserver signin_observer;
+                  const std::string& password,
+                  bool wait_for_account_cookies,
+                  signin_metrics::Source signin_source) {
+  SignInObserver signin_observer(wait_for_account_cookies);
   scoped_ptr<SigninTracker> tracker =
       SigninTrackerFactory::CreateForProfile(browser->profile(),
                                              &signin_observer);
 
-  GURL signin_url = signin::GetPromoURL(
-      signin_metrics::SOURCE_START_PAGE, false);
+  GURL signin_url = signin::GetPromoURL(signin_source, false);
   DVLOG(1) << "Navigating to " << signin_url;
   // For some tests, the window is not shown yet and this might be the first tab
   // navigation, so GetActiveWebContents() for CURRENT_TAB is NULL. That's why
@@ -215,4 +232,12 @@
   return signin_observer.DidSignIn();
 }
 
+bool SignInWithUI(Browser* browser,
+                  const std::string& username,
+                  const std::string& password) {
+  return SignInWithUI(browser, username, password,
+                      false  /* wait_for_account_cookies */,
+                      signin_metrics::SOURCE_START_PAGE);
+}
+
 }  // namespace login_ui_test_utils
diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.h b/chrome/browser/ui/webui/signin/login_ui_test_utils.h
index bf9a11051..acddd39 100644
--- a/chrome/browser/ui/webui/signin/login_ui_test_utils.h
+++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.h
@@ -7,6 +7,8 @@
 
 #include <string>
 
+#include "components/signin/core/browser/signin_metrics.h"
+
 class Browser;
 
 namespace login_ui_test_utils {
@@ -41,6 +43,17 @@
 
 // A function to sign in a user using Chrome sign-in UI interface.
 // This will block until a signin succeeded or failed notification is observed.
+// In case |wait_for_account_cookies|, the call will block until the account
+// cookies have been written to the cookie jar.
+// |signin_source| identifies the source used to load the signin page.
+bool SignInWithUI(Browser* browser,
+                  const std::string& email,
+                  const std::string& password,
+                  bool wait_for_account_cookies,
+                  signin_metrics::Source signin_source);
+
+// Most common way to sign in a user, it does not wait for cookies to be set
+// and uses the SOURCE_START_PAGE as signin source.
 bool SignInWithUI(Browser* browser,
                   const std::string& email,
                   const std::string& password);
diff --git a/chrome/browser_tests.isolate b/chrome/browser_tests.isolate
index 7e793888..c9bf511 100644
--- a/chrome/browser_tests.isolate
+++ b/chrome/browser_tests.isolate
@@ -71,6 +71,7 @@
           '../third_party/safe_browsing/',
           '../third_party/simplejson/',
           '../third_party/tlslite/',
+          '../ui/webui/resources/js/webui_resource_test.js',
           '<(PRODUCT_DIR)/browser_tests.pak',
           '<(PRODUCT_DIR)/pseudo_locales/',
           '<(PRODUCT_DIR)/pyproto/',
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 7c2fe9e..25c1e0b6 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -317,6 +317,8 @@
       'browser/browser_shutdown.h',
       'browser/browser_util_win.cc',
       'browser/browser_util_win.h',
+      'browser/browsing_data/autofill_counter.cc',
+      'browser/browsing_data/autofill_counter.h',
       'browser/browsing_data/browsing_data_appcache_helper.cc',
       'browser/browsing_data/browsing_data_appcache_helper.h',
       'browser/browsing_data/browsing_data_cache_storage_helper.cc',
@@ -663,6 +665,8 @@
       'browser/memory_details_win.cc',
       'browser/mod_pagespeed/mod_pagespeed_metrics.cc',
       'browser/mod_pagespeed/mod_pagespeed_metrics.h',
+      'browser/mojo_runner_util.cc',
+      'browser/mojo_runner_util.h',
       'browser/native_window_notification_source.h',
       'browser/net/predictor_tab_helper.cc',
       'browser/net/predictor_tab_helper.h',
@@ -3114,7 +3118,7 @@
         '../components/components.gyp:ssl_errors',
         '../components/components.gyp:suggestions',
         '../components/components.gyp:signin_core_browser',
-        '../components/components.gyp:startup_metric_utils',
+        '../components/components.gyp:startup_metric_utils_browser',
         '../components/components.gyp:sync_bookmarks',
         '../components/components.gyp:sync_driver',
         '../components/components.gyp:sync_sessions',
@@ -3469,7 +3473,7 @@
           'dependencies': [
             'safe_browsing_chunk_proto',
             'safe_browsing_metadata_proto',
-            'safe_browsing_report_proto',
+            'safe_browsing_proto',
           ],
           'conditions': [
             ['safe_browsing == 1', {
@@ -3901,19 +3905,6 @@
       'includes': [ '../build/protoc.gypi' ]
     },
     {
-      # Protobuf compiler / generator for the safebrowsing reporting
-      # protocol buffer.
-      # GN version: //chrome/browser/safe_browsing:report_proto
-      'target_name': 'safe_browsing_report_proto',
-      'type': 'static_library',
-      'sources': [ 'browser/safe_browsing/report.proto' ],
-      'variables': {
-        'proto_in_dir': 'browser/safe_browsing',
-        'proto_out_dir': 'chrome/browser/safe_browsing',
-      },
-      'includes': [ '../build/protoc.gypi' ]
-    },
-    {
       # Protobuf compiler / generator for the safebrowsing incident reporting
       # service state store data protocol buffer.
       # GN version: //chrome/browser/safe_browsing/incident_reporting:state_store_data_proto
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi
index aadff083..6214571 100644
--- a/chrome/chrome_browser_chromeos.gypi
+++ b/chrome/chrome_browser_chromeos.gypi
@@ -1101,8 +1101,7 @@
         'device_policy_proto',
         'installer_util',
         'safe_browsing_chunk_proto',
-        'safe_browsing_proto',
-        'safe_browsing_report_proto',
+        'safe_browsing_proto',        
         '../build/linux/system.gyp:dbus',
         '../chromeos/chromeos.gyp:chromeos',
         '../chromeos/chromeos.gyp:chromeos_test_support',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index 3f58812..9606818 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -644,6 +644,14 @@
       'browser/ui/views/frame/web_app_left_header_view_ash.cc',
       'browser/ui/views/frame/web_app_left_header_view_ash.h',
       'browser/ui/views/tabs/window_finder_ash.cc',
+      'browser/ui/views/tabs/window_finder_impl.h',
+      'browser/ui/views/tabs/window_finder_impl.cc',
+    ],
+    # Used when Android + Views.
+    'chrome_browser_ui_views_android_sources': [
+      'browser/ui/views/tabs/window_finder_android.cc',
+      'browser/ui/views/tabs/window_finder_impl.h',
+      'browser/ui/views/tabs/window_finder_impl.cc',
     ],
     # Used when ash is disabled.
     'chrome_browser_ui_non_ash_sources': [
@@ -2917,7 +2925,6 @@
           'dependencies': [
             'safe_browsing_chunk_proto',
             'safe_browsing_proto',
-            'safe_browsing_report_proto',
           ],
         }],
         ['buildtype!="Official" and chromeos==1', {
@@ -2977,6 +2984,9 @@
                 }],
               ],
             }],
+            ['OS=="android"', {
+              'sources': [ '<@(chrome_browser_ui_views_android_sources)' ],
+            }],
             ['enable_extensions==1', {
               'dependencies': [
                 '<(DEPTH)/extensions/components/extensions_components.gyp:native_app_window',
diff --git a/chrome/chrome_dll.gypi b/chrome/chrome_dll.gypi
index b2a2081..67f9b1b 100644
--- a/chrome/chrome_dll.gypi
+++ b/chrome/chrome_dll.gypi
@@ -260,23 +260,6 @@
                     '../printing/printing.gyp:printing',
                   ],
                 }],
-                ['chrome_pgo_phase==1', {
-                  'msvs_settings': {
-                    'VCLinkerTool': {
-                      'LinkTimeCodeGeneration': '2',
-                      'AdditionalOptions': [
-                        '/PogoSafeMode',
-                      ],
-                    },
-                  },
-                }],
-                ['chrome_pgo_phase==2', {
-                  'msvs_settings': {
-                    'VCLinkerTool': {
-                      'LinkTimeCodeGeneration': '3',
-                    },
-                  },
-                }],
               ]
             }],
             ['chrome_multiple_dll==1', {
diff --git a/chrome/chrome_exe.gypi b/chrome/chrome_exe.gypi
index 94f56ef..352a01b 100644
--- a/chrome/chrome_exe.gypi
+++ b/chrome/chrome_exe.gypi
@@ -366,7 +366,7 @@
             # "chrome" etc.; should we try to extract from there instead?
           ],
           'dependencies': [
-            '../components/components.gyp:startup_metric_utils',
+            '../components/components.gyp:startup_metric_utils_browser',
             'chrome_resources.gyp:packed_extra_resources',
             'chrome_resources.gyp:packed_resources',
             # Copy Flash Player files to PRODUCT_DIR if applicable. Let the .gyp
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
index ee1800f..b4d1dcf 100644
--- a/chrome/chrome_renderer.gypi
+++ b/chrome/chrome_renderer.gypi
@@ -181,8 +181,8 @@
     ],
     # For safe_browsing==1 or safe_browsing==2.
     'chrome_renderer_basic_safe_browsing_sources': [
-      'renderer/safe_browsing/malware_dom_details.cc',
-      'renderer/safe_browsing/malware_dom_details.h',
+      'renderer/safe_browsing/threat_dom_details.cc',
+      'renderer/safe_browsing/threat_dom_details.h',
     ],
     # For safe_browsing==1 only.
     'chrome_renderer_full_safe_browsing_sources': [
@@ -251,7 +251,6 @@
         '../components/components.gyp:network_hints_renderer',
         '../components/components.gyp:omnibox_common',
         '../components/components.gyp:error_page_renderer',
-        '../components/components.gyp:startup_metric_utils',
         '../components/components.gyp:page_load_metrics_renderer',
         '../components/components.gyp:password_manager_content_renderer',
         '../components/components.gyp:plugins_renderer',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 129e1be..fc6b75b 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -71,6 +71,7 @@
       'browser/banners/app_banner_data_fetcher_browsertest.cc',
       'browser/bitmap_fetcher/bitmap_fetcher_browsertest.cc',
       'browser/browser_encoding_browsertest.cc',
+      'browser/browsing_data/autofill_counter_browsertest.cc',
       'browser/browsing_data/browsing_data_cache_storage_helper_browsertest.cc',
       'browser/browsing_data/browsing_data_database_helper_browsertest.cc',
       'browser/browsing_data/browsing_data_helper_browsertest.h',
@@ -473,7 +474,7 @@
       'browser/ui/cocoa/certificate_viewer_mac_browsertest.mm',
       'browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm',
       'browser/ui/cocoa/content_settings/collected_cookies_mac_browsertest.mm',
-      'browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_unittest.mm',
+      'browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_browsertest.mm',
       'browser/ui/cocoa/dev_tools_controller_browsertest.mm',
       'browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm',
       'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h',
@@ -493,6 +494,7 @@
       'browser/ui/cocoa/web_contents_modal_dialog_manager_views_mac_browsertest.mm',
       'browser/ui/cocoa/website_settings/permission_bubble_cocoa_browser_test.mm',
       'browser/ui/content_settings/content_setting_bubble_model_browsertest.cc',
+      'browser/ui/content_settings/content_setting_image_model_browsertest.cc',
       'browser/ui/exclusive_access/fullscreen_controller_browsertest.cc',
       'browser/ui/extensions/extension_message_bubble_browsertest.cc',
       'browser/ui/extensions/extension_message_bubble_browsertest.h',
@@ -852,7 +854,7 @@
       'browser/safe_browsing/safe_browsing_test.cc',
       'browser/safe_browsing/test_database_manager.cc',
       'browser/safe_browsing/test_database_manager.h',
-      'renderer/safe_browsing/malware_dom_details_browsertest.cc',
+      'renderer/safe_browsing/threat_dom_details_browsertest.cc',
       'renderer/safe_browsing/phishing_classifier_browsertest.cc',
       'renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc',
       'renderer/safe_browsing/phishing_dom_feature_extractor_browsertest.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 6a96a8f..38e3f3e 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -1571,6 +1571,7 @@
       'browser/ui/webui/help/version_updater_chromeos_unittest.cc',
       'browser/ui/webui/ntp/ntp_user_data_logger_unittest.cc',
       'browser/ui/webui/options/autofill_options_handler_unittest.cc',
+      'browser/ui/webui/options/clear_browser_data_handler_unittest.cc',
       'browser/ui/webui/options/language_options_handler_unittest.cc',
       'browser/ui/webui/options/pepper_flash_content_settings_utils_unittest.cc',
       'browser/ui/webui/options/sync_setup_handler_unittest.cc',
diff --git a/chrome/common/extensions/api/settings_private.idl b/chrome/common/extensions/api/settings_private.idl
index 51c1ded..815cf61 100644
--- a/chrome/common/extensions/api/settings_private.idl
+++ b/chrome/common/extensions/api/settings_private.idl
@@ -57,6 +57,8 @@
   callback OnPrefSetCallback = void (boolean success);
   callback GetAllPrefsCallback = void (PrefObject[] prefs);
   callback GetPrefCallback = void (PrefObject pref);
+  callback GetDefaultZoomPercentCallback = void (long percent);
+  callback SetDefaultZoomPercentCallback = void (boolean success);
 
   interface Functions {
     // Sets a settings value.
@@ -72,6 +74,13 @@
 
     // Gets the value of a specific pref.
     static void getPref(DOMString name, GetPrefCallback callback);
+
+    // Gets the page zoom factor as an integer percentage.
+    static void getDefaultZoomPercent(GetDefaultZoomPercentCallback callback);
+
+    // Sets the page zoom factor from a zoom percentage.
+    static void setDefaultZoomPercent(long percent,
+        optional SetDefaultZoomPercentCallback callback);
   };
 
   interface Events {
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 51736d9..7e325e8 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -790,6 +790,10 @@
 // A boolean pref set to true if the virtual keyboard should be enabled.
 const char kTouchVirtualKeyboardEnabled[] = "ui.touch_virtual_keyboard_enabled";
 
+// Boolean prefs for the status of the touch screen and the touchpad.
+const char kTouchScreenEnabled[] = "events.touch_screen.enabled";
+const char kTouchPadEnabled[] = "events.touch_pad.enabled";
+
 // A boolean pref that controls whether the dark connect feature is enabled.
 // The dark connect feature allows a Chrome OS device to periodically wake
 // from suspend in a low-power state to maintain WiFi connectivity.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 00c8080..0b43272 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -262,6 +262,8 @@
 extern const char kCurrentWallpaperAppName[];
 extern const char kFileSystemProviderMounted[];
 extern const char kTouchVirtualKeyboardEnabled[];
+extern const char kTouchScreenEnabled[];
+extern const char kTouchPadEnabled[];
 extern const char kWakeOnWifiDarkConnect[];
 extern const char kCaptivePortalAuthenticationIgnoresProxy[];
 extern const char kForceMaximizeOnFirstRun[];
diff --git a/chrome/common/safe_browsing/csd.proto b/chrome/common/safe_browsing/csd.proto
index db2a1f9..fcce36b 100644
--- a/chrome/common/safe_browsing/csd.proto
+++ b/chrome/common/safe_browsing/csd.proto
@@ -2,9 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Client side phishing and malware detection request and response
-// protocol buffers.  Those protocol messages should be kept in sync
-// with the server implementation.
+// This proto file includes:
+// (1) Client side phishing and malware detection request and response
+//   protocol buffers.  Those protocol messages should be kept in sync
+//   with the server implementation.
+//
+// (2) Safe Browsing reporting protocol buffers.
+//   A ClientSafeBrowsingReportRequest is sent when a user opts-in to
+//   sending detailed threat reports from the safe browsing interstitial page.
+//   It is a list of Resource messages, which may contain the url of a
+//   resource such as the page in the address bar or any other resource
+//   that was loaded for this page.
+//   In addition to the url, a resource can contain HTTP request and response
+//   headers and bodies.
 //
 // If you want to change this protocol definition or you have questions
 // regarding its format please contact chrome-anti-phishing@googlegroups.com.
@@ -634,3 +644,97 @@
 
   optional ClientIncidentReport.DownloadDetails download = 2;
 }
+
+// A Detailed Safebrowsing Report from clients. Chrome safebrowsing reports are
+// only sent by Chrome users who have opted into extended Safe Browsing.
+// This proto is replacing ClientMalwareReportRequest.
+// Next tag: 12
+message ClientSafeBrowsingReportRequest {
+  // Note: A lot of the "optional" fields would make sense to be
+  // "required" instead.  However, having them as optional allows the
+  // clients to send "stripped down" versions of the message in the
+  // future, if we want to.
+
+  enum ReportType {
+    UNKNOWN = 0;
+    URL_PHISHING = 1;
+    URL_MALWARE = 2;
+    URL_UNWANTED = 3;
+    CLIENT_SIDE_PHISHING_URL = 4;
+    CLIENT_SIDE_MALWARE_URL = 5;
+    MALICIOUS_DOWNLOAD_RECOVERY = 6;
+  }
+
+  message HTTPHeader {
+    required bytes name = 1;
+    optional bytes value = 2;
+  }
+
+  message HTTPRequest {
+    message FirstLine {
+      optional bytes verb = 1;
+      optional bytes uri = 2;
+      optional bytes version = 3;
+    }
+
+    optional FirstLine firstline = 1;
+    repeated HTTPHeader headers = 2;
+    optional bytes body = 3;
+
+    // bodydigest and bodylength can be useful if the report does not
+    // contain the body itself.
+    optional bytes bodydigest = 4;  // 32-byte hex md5 digest of body.
+    optional int32 bodylength = 5;  // length of body.
+  }
+
+  message HTTPResponse {
+    message FirstLine {
+      optional int32 code = 1;
+      optional bytes reason = 2;
+      optional bytes version = 3;
+    }
+
+    optional FirstLine firstline = 1;
+    repeated HTTPHeader headers = 2;
+    optional bytes body = 3;
+    optional bytes bodydigest = 4;  // 32-byte hex md5 digest of body.
+    optional int32 bodylength = 5;  // length of body.
+    optional bytes remote_ip = 6;   // IP of the server.
+  }
+
+  message Resource {
+    required int32 id = 1;
+    optional string url = 2;
+    optional HTTPRequest request = 3;
+    optional HTTPResponse response = 4;
+    optional int32 parent_id = 5;
+    repeated int32 child_ids = 6;
+    optional string tag_name = 7;
+  }
+
+  optional ReportType type = 10;
+
+  // Only set if ReportType is MALICIOUS_DOWNLOAD_RECOVERY.
+  optional ClientDownloadResponse.Verdict download_verdict = 11;
+
+  // URL of the page in the address bar.
+  optional string url = 1;
+  optional string page_url = 2;
+  optional string referrer_url = 3;
+
+  repeated Resource resources = 4;
+
+  // Whether the report is complete.
+  optional bool complete = 5;
+
+  // The ASN and country of the client IP. These fields are filled up by
+  // csd_frontend
+  repeated string client_asn = 6;
+  optional string client_country = 7;
+
+  // Whether user chose to proceed.
+  optional bool did_proceed = 8;
+
+  // Whether user visited this origin before.
+  optional bool repeat_visit = 9;
+}
\ No newline at end of file
diff --git a/chrome/common/safe_browsing/safebrowsing_messages.h b/chrome/common/safe_browsing/safebrowsing_messages.h
index 619fb0b0..7391798 100644
--- a/chrome/common/safe_browsing/safebrowsing_messages.h
+++ b/chrome/common/safe_browsing/safebrowsing_messages.h
@@ -13,7 +13,7 @@
 #define IPC_MESSAGE_START SafeBrowsingMsgStart
 
 // A node is essentially a frame.
-IPC_STRUCT_BEGIN(SafeBrowsingHostMsg_MalwareDOMDetails_Node)
+IPC_STRUCT_BEGIN(SafeBrowsingHostMsg_ThreatDOMDetails_Node)
   // URL of this resource. Can be empty.
   IPC_STRUCT_MEMBER(GURL, url)
 
@@ -31,9 +31,9 @@
 // SafeBrowsing client-side detection messages sent from the renderer to the
 // browser.
 
-// Send part of the DOM to the browser, to be used in a malware report.
-IPC_MESSAGE_ROUTED1(SafeBrowsingHostMsg_MalwareDOMDetails,
-                    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>)
+// Send part of the DOM to the browser, to be used in a threat report.
+IPC_MESSAGE_ROUTED1(SafeBrowsingHostMsg_ThreatDOMDetails,
+                    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>)
 
 #if defined(FULL_SAFE_BROWSING)
 // Inform the browser that the client-side phishing detector running in the
@@ -48,8 +48,8 @@
 // SafeBrowsing client-side detection messages sent from the browser to the
 // renderer.
 
-// Request a DOM tree when a malware interstitial is shown.
-IPC_MESSAGE_ROUTED0(SafeBrowsingMsg_GetMalwareDOMDetails)
+// Request a DOM tree when a safe browsing interstitial is shown.
+IPC_MESSAGE_ROUTED0(SafeBrowsingMsg_GetThreatDOMDetails)
 
 #if defined(FULL_SAFE_BROWSING)
 // A classification model for client-side phishing detection.
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index e041627..13b806d7 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -49,7 +49,6 @@
     "//components/password_manager/content/renderer",
     "//components/plugins/renderer",
     "//components/printing/renderer",
-    "//components/startup_metric_utils",
     "//components/translate/content/renderer",
     "//components/translate/core/common",
     "//components/translate/core/language_detection",
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 2ce1501..e5a0ea418 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -46,8 +46,8 @@
 #include "chrome/renderer/prerender/prerender_dispatcher.h"
 #include "chrome/renderer/prerender/prerender_helper.h"
 #include "chrome/renderer/prerender/prerenderer_client.h"
-#include "chrome/renderer/safe_browsing/malware_dom_details.h"
 #include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
+#include "chrome/renderer/safe_browsing/threat_dom_details.h"
 #include "chrome/renderer/searchbox/search_bouncer.h"
 #include "chrome/renderer/searchbox/searchbox.h"
 #include "chrome/renderer/searchbox/searchbox_extension.h"
@@ -555,7 +555,7 @@
 #endif
   new prerender::PrerendererClient(render_view);
 #if defined(FULL_SAFE_BROWSING)
-  safe_browsing::MalwareDOMDetails::Create(render_view);
+  safe_browsing::ThreatDOMDetails::Create(render_view);
 #endif
 
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
diff --git a/chrome/renderer/extensions/automation_internal_custom_bindings.cc b/chrome/renderer/extensions/automation_internal_custom_bindings.cc
index b4d9374..0ecab81 100644
--- a/chrome/renderer/extensions/automation_internal_custom_bindings.cc
+++ b/chrome/renderer/extensions/automation_internal_custom_bindings.cc
@@ -473,11 +473,22 @@
       });
 }
 
-AutomationInternalCustomBindings::~AutomationInternalCustomBindings() {
+AutomationInternalCustomBindings::~AutomationInternalCustomBindings() {}
+
+void AutomationInternalCustomBindings::Invalidate() {
+  ObjectBackedNativeHandler::Invalidate();
+
   if (message_filter_)
     message_filter_->Detach();
-  STLDeleteContainerPairSecondPointers(tree_id_to_tree_cache_map_.begin(),
-                                       tree_id_to_tree_cache_map_.end());
+
+  // Delete the TreeCaches quickly by first clearing their delegates so
+  // we don't get a callback for every node being deleted.
+  for (auto iter : tree_id_to_tree_cache_map_) {
+    TreeCache* cache = iter.second;
+    cache->tree.SetDelegate(nullptr);
+    delete cache;
+  }
+  tree_id_to_tree_cache_map_.clear();
 }
 
 void AutomationInternalCustomBindings::OnMessageReceived(
diff --git a/chrome/renderer/extensions/automation_internal_custom_bindings.h b/chrome/renderer/extensions/automation_internal_custom_bindings.h
index d2639942..5be7c9d 100644
--- a/chrome/renderer/extensions/automation_internal_custom_bindings.h
+++ b/chrome/renderer/extensions/automation_internal_custom_bindings.h
@@ -47,6 +47,9 @@
   }
 
  private:
+  // ObjectBackedNativeHandler overrides:
+  void Invalidate() override;
+
   // Returns whether this extension has the "interact" permission set (either
   // explicitly or implicitly after manifest parsing).
   void IsInteractPermitted(const v8::FunctionCallbackInfo<v8::Value>& args);
diff --git a/chrome/renderer/safe_browsing/malware_dom_details.h b/chrome/renderer/safe_browsing/malware_dom_details.h
deleted file mode 100644
index f65007f..0000000
--- a/chrome/renderer/safe_browsing/malware_dom_details.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// MalwareDOMDetails iterates over a document's frames and gathers
-// interesting URLs such as those of scripts and frames. When done, it sends
-// them to the MalwareDetails that requested them.
-
-#ifndef CHROME_RENDERER_SAFE_BROWSING_MALWARE_DOM_DETAILS_H_
-#define CHROME_RENDERER_SAFE_BROWSING_MALWARE_DOM_DETAILS_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "content/public/renderer/render_view_observer.h"
-
-struct SafeBrowsingHostMsg_MalwareDOMDetails_Node;
-
-namespace safe_browsing {
-
-// There is one MalwareDOMDetails per RenderView.
-class MalwareDOMDetails : public content::RenderViewObserver {
- public:
-  // An upper limit on the number of nodes we collect. Not const for the test.
-  static uint32 kMaxNodes;
-
-  static MalwareDOMDetails* Create(content::RenderView* render_view);
-  ~MalwareDOMDetails() override;
-
-  // Begins extracting resource urls for the page currently loaded in
-  // this object's RenderView.
-  // Exposed for testing.
-  void ExtractResources(
-      std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>* resources);
-
- private:
-  // Creates a MalwareDOMDetails for the specified RenderView.
-  // The MalwareDOMDetails should be destroyed prior to destroying
-  // the RenderView.
-  explicit MalwareDOMDetails(content::RenderView* render_view);
-
-  // RenderViewObserver implementation.
-  bool OnMessageReceived(const IPC::Message& message) override;
-
-  void OnGetMalwareDOMDetails();
-
-  DISALLOW_COPY_AND_ASSIGN(MalwareDOMDetails);
-};
-
-}  // namespace safe_browsing
-
-#endif  // CHROME_RENDERER_SAFE_BROWSING_MALWARE_DOM_DETAILS_H_
diff --git a/chrome/renderer/safe_browsing/malware_dom_details.cc b/chrome/renderer/safe_browsing/threat_dom_details.cc
similarity index 69%
rename from chrome/renderer/safe_browsing/malware_dom_details.cc
rename to chrome/renderer/safe_browsing/threat_dom_details.cc
index 7efef40..1a012071 100644
--- a/chrome/renderer/safe_browsing/malware_dom_details.cc
+++ b/chrome/renderer/safe_browsing/threat_dom_details.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/renderer/safe_browsing/malware_dom_details.h"
+#include "chrome/renderer/safe_browsing/threat_dom_details.h"
 
 #include "base/compiler_specific.h"
 #include "chrome/common/chrome_constants.h"
@@ -22,14 +22,14 @@
 // Handler for the various HTML elements that we extract URLs from.
 void HandleElement(
     const blink::WebElement& element,
-    SafeBrowsingHostMsg_MalwareDOMDetails_Node* parent_node,
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>* resources) {
+    SafeBrowsingHostMsg_ThreatDOMDetails_Node* parent_node,
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>* resources) {
   if (!element.hasAttribute("src"))
     return;
 
   // Retrieve the link and resolve the link in case it's relative.
-  blink::WebURL full_url = element.document().completeURL(
-      element.getAttribute("src"));
+  blink::WebURL full_url =
+      element.document().completeURL(element.getAttribute("src"));
 
   const GURL& child_url = GURL(full_url);
 
@@ -37,7 +37,7 @@
   parent_node->children.push_back(child_url);
 
   // Create the child node.
-  SafeBrowsingHostMsg_MalwareDOMDetails_Node child_node;
+  SafeBrowsingHostMsg_ThreatDOMDetails_Node child_node;
   child_node.url = child_url;
   child_node.tag_name = element.tagName().utf8();
   child_node.parent = parent_node->url;
@@ -47,42 +47,40 @@
 }  // namespace
 
 // An upper limit on the number of nodes we collect.
-uint32 MalwareDOMDetails::kMaxNodes = 500;
+uint32 ThreatDOMDetails::kMaxNodes = 500;
 
 // static
-MalwareDOMDetails* MalwareDOMDetails::Create(content::RenderView* render_view) {
+ThreatDOMDetails* ThreatDOMDetails::Create(content::RenderView* render_view) {
   // Private constructor and public static Create() method to facilitate
   // stubbing out this class for binary-size reduction purposes.
-  return new MalwareDOMDetails(render_view);
+  return new ThreatDOMDetails(render_view);
 }
 
-MalwareDOMDetails::MalwareDOMDetails(content::RenderView* render_view)
-    : content::RenderViewObserver(render_view) {
-}
+ThreatDOMDetails::ThreatDOMDetails(content::RenderView* render_view)
+    : content::RenderViewObserver(render_view) {}
 
-MalwareDOMDetails::~MalwareDOMDetails() {
-}
+ThreatDOMDetails::~ThreatDOMDetails() {}
 
-bool MalwareDOMDetails::OnMessageReceived(const IPC::Message& message) {
+bool ThreatDOMDetails::OnMessageReceived(const IPC::Message& message) {
   bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(MalwareDOMDetails, message)
-    IPC_MESSAGE_HANDLER(SafeBrowsingMsg_GetMalwareDOMDetails,
-                        OnGetMalwareDOMDetails)
+  IPC_BEGIN_MESSAGE_MAP(ThreatDOMDetails, message)
+    IPC_MESSAGE_HANDLER(SafeBrowsingMsg_GetThreatDOMDetails,
+                        OnGetThreatDOMDetails)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
 }
 
-void MalwareDOMDetails::OnGetMalwareDOMDetails() {
-  std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> resources;
+void ThreatDOMDetails::OnGetThreatDOMDetails() {
+  std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> resources;
   ExtractResources(&resources);
   // Notify the browser.
-  render_view()->Send(new SafeBrowsingHostMsg_MalwareDOMDetails(
+  render_view()->Send(new SafeBrowsingHostMsg_ThreatDOMDetails(
       render_view()->GetRoutingID(), resources));
 }
 
-void MalwareDOMDetails::ExtractResources(
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>* resources) {
+void ThreatDOMDetails::ExtractResources(
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>* resources) {
   blink::WebView* web_view = render_view()->GetWebView();
   if (!web_view) {
     NOTREACHED();
@@ -91,7 +89,7 @@
   blink::WebFrame* frame = web_view->mainFrame();
   for (; frame; frame = frame->traverseNext(false /* don't wrap */)) {
     DCHECK(frame);
-    SafeBrowsingHostMsg_MalwareDOMDetails_Node details_node;
+    SafeBrowsingHostMsg_ThreatDOMDetails_Node details_node;
     blink::WebDocument document = frame->document();
     details_node.url = GURL(document.url());
     if (document.isNull()) {
diff --git a/chrome/renderer/safe_browsing/threat_dom_details.h b/chrome/renderer/safe_browsing/threat_dom_details.h
new file mode 100644
index 0000000..41d87d17
--- /dev/null
+++ b/chrome/renderer/safe_browsing/threat_dom_details.h
@@ -0,0 +1,53 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ThreatDOMDetails iterates over a document's frames and gathers
+// interesting URLs such as those of scripts and frames. When done, it sends
+// them to the ThreatDetails that requested them.
+
+#ifndef CHROME_RENDERER_SAFE_BROWSING_THREAT_DOM_DETAILS_H_
+#define CHROME_RENDERER_SAFE_BROWSING_THREAT_DOM_DETAILS_H_
+
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "content/public/renderer/render_view_observer.h"
+
+struct SafeBrowsingHostMsg_ThreatDOMDetails_Node;
+
+namespace safe_browsing {
+
+// There is one ThreatDOMDetails per RenderView.
+class ThreatDOMDetails : public content::RenderViewObserver {
+ public:
+  // An upper limit on the number of nodes we collect. Not const for the test.
+  static uint32 kMaxNodes;
+
+  static ThreatDOMDetails* Create(content::RenderView* render_view);
+  ~ThreatDOMDetails() override;
+
+  // Begins extracting resource urls for the page currently loaded in
+  // this object's RenderView.
+  // Exposed for testing.
+  void ExtractResources(
+      std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node>* resources);
+
+ private:
+  // Creates a ThreatDOMDetails for the specified RenderView.
+  // The ThreatDOMDetails should be destroyed prior to destroying
+  // the RenderView.
+  explicit ThreatDOMDetails(content::RenderView* render_view);
+
+  // RenderViewObserver implementation.
+  bool OnMessageReceived(const IPC::Message& message) override;
+
+  void OnGetThreatDOMDetails();
+
+  DISALLOW_COPY_AND_ASSIGN(ThreatDOMDetails);
+};
+
+}  // namespace safe_browsing
+
+#endif  // CHROME_RENDERER_SAFE_BROWSING_THREAT_DOM_DETAILS_H_
diff --git a/chrome/renderer/safe_browsing/malware_dom_details_browsertest.cc b/chrome/renderer/safe_browsing/threat_dom_details_browsertest.cc
similarity index 72%
rename from chrome/renderer/safe_browsing/malware_dom_details_browsertest.cc
rename to chrome/renderer/safe_browsing/threat_dom_details_browsertest.cc
index e4ef1e6..becab0d 100644
--- a/chrome/renderer/safe_browsing/malware_dom_details_browsertest.cc
+++ b/chrome/renderer/safe_browsing/threat_dom_details_browsertest.cc
@@ -4,43 +4,42 @@
 
 #include "base/strings/stringprintf.h"
 #include "chrome/common/safe_browsing/safebrowsing_messages.h"
-#include "chrome/renderer/safe_browsing/malware_dom_details.h"
+#include "chrome/renderer/safe_browsing/threat_dom_details.h"
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "net/base/escape.h"
 
-typedef ChromeRenderViewTest MalwareDOMDetailsTest;
+typedef ChromeRenderViewTest ThreatDOMDetailsTest;
 
-
-TEST_F(MalwareDOMDetailsTest, Everything) {
-  scoped_ptr<safe_browsing::MalwareDOMDetails> details(
-      safe_browsing::MalwareDOMDetails::Create(view_));
+TEST_F(ThreatDOMDetailsTest, Everything) {
+  scoped_ptr<safe_browsing::ThreatDOMDetails> details(
+      safe_browsing::ThreatDOMDetails::Create(view_));
   // Lower kMaxNodes for the test. Loading 500 subframes in a
   // debug build takes a while.
   details->kMaxNodes = 50;
 
   const char urlprefix[] = "data:text/html;charset=utf-8,";
 
-  { // An page with an internal script
+  {  // An page with an internal script
     std::string html = "<html><head><script></script></head></html>";
     LoadHTML(html.c_str());
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
     details->ExtractResources(&params);
     ASSERT_EQ(1u, params.size());
     EXPECT_EQ(GURL(urlprefix + html), params[0].url);
   }
 
-  { // A page with 2 external scripts.
+  {  // A page with 2 external scripts.
     // Note: This part of the test causes 2 leaks: LEAK: 5 WebCoreNode
     // LEAK: 2 CachedResource.
     GURL script1_url("data:text/javascript;charset=utf-8,var a=1;");
     GURL script2_url("data:text/javascript;charset=utf-8,var b=2;");
     std::string html = "<html><head><script src=\"" + script1_url.spec() +
-        "\"></script><script src=\"" + script2_url.spec() +
-        "\"></script></head></html>";
+                       "\"></script><script src=\"" + script2_url.spec() +
+                       "\"></script></head></html>";
     GURL url(urlprefix + html);
 
     LoadHTML(html.c_str());
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
     details->ExtractResources(&params);
     ASSERT_EQ(3u, params.size());
     EXPECT_EQ(script1_url, params[0].url);
@@ -50,21 +49,23 @@
     EXPECT_EQ(url, params[2].url);
   }
 
-  { // A page with an iframe which in turn contains an iframe.
+  {  // A page with an iframe which in turn contains an iframe.
     //  html
     //   \ iframe1
     //    \ iframe2
     std::string iframe2_html = "<html><body>iframe2</body></html>";
     GURL iframe2_url(urlprefix + iframe2_html);
-    std::string iframe1_html = "<iframe src=\"" + net::EscapeForHTML(
-        iframe2_url.spec()) + "\"></iframe>";
+    std::string iframe1_html = "<iframe src=\"" +
+                               net::EscapeForHTML(iframe2_url.spec()) +
+                               "\"></iframe>";
     GURL iframe1_url(urlprefix + iframe1_html);
-    std::string html = "<html><head><iframe src=\"" + net::EscapeForHTML(
-        iframe1_url.spec()) + "\"></iframe></head></html>";
+    std::string html = "<html><head><iframe src=\"" +
+                       net::EscapeForHTML(iframe1_url.spec()) +
+                       "\"></iframe></head></html>";
     GURL url(urlprefix + html);
 
     LoadHTML(html.c_str());
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
     details->ExtractResources(&params);
     ASSERT_EQ(5u, params.size());
 
@@ -96,34 +97,34 @@
     EXPECT_EQ(0u, params[4].children.size());
   }
 
-  { // >50 subframes, to verify kMaxNodes.
+  {  // >50 subframes, to verify kMaxNodes.
     std::string html;
     for (int i = 0; i < 55; ++i) {
       // The iframe contents is just a number.
       GURL iframe_url(base::StringPrintf("%s%d", urlprefix, i));
       html += "<iframe src=\"" + net::EscapeForHTML(iframe_url.spec()) +
-          "\"></iframe>";
+              "\"></iframe>";
     }
     GURL url(urlprefix + html);
 
     LoadHTML(html.c_str());
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
     details->ExtractResources(&params);
     ASSERT_EQ(51u, params.size());
   }
 
-  { // A page with >50 scripts, to verify kMaxNodes.
+  {  // A page with >50 scripts, to verify kMaxNodes.
     std::string html;
     for (int i = 0; i < 55; ++i) {
       // The iframe contents is just a number.
       GURL script_url(base::StringPrintf("%s%d", urlprefix, i));
       html += "<script src=\"" + net::EscapeForHTML(script_url.spec()) +
-          "\"></script>";
+              "\"></script>";
     }
     GURL url(urlprefix + html);
 
     LoadHTML(html.c_str());
-    std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params;
+    std::vector<SafeBrowsingHostMsg_ThreatDOMDetails_Node> params;
     details->ExtractResources(&params);
     ASSERT_EQ(51u, params.size());
   }
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 924b12f5..63355a6b 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -139,6 +139,8 @@
 _ANDROID_NEGATIVE_FILTER['chromium'] = (
     _ANDROID_NEGATIVE_FILTER['chrome'] + [
         'ChromeDriverTest.testSwitchToWindow',
+        # https://code.google.com/p/chromium/issues/detail?id=553649
+        'ChromeDriverTest.testTouchScrollElement',
     ]
 )
 _ANDROID_NEGATIVE_FILTER['chromedriver_webview_shell'] = (
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
index e194af3d..708cc69 100644
--- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
+++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -35,12 +35,25 @@
   /** @override */
   extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([
     'extension_service_test.js',
+    'extension_sidebar_test.js',
+    '../mock_controller.js',
+    '../../../../../ui/webui/resources/js/webui_resource_test.js',
   ]),
 
   /** @override */
   typedefCppFixture: 'ExtensionSettingsUIBrowserTest',
 };
 
+TEST_F('CrExtensionsBrowserTest', 'ExtensionSidebarLayoutTest', function() {
+  extension_sidebar_tests.registerTests();
+  mocha.grep('test sidebar layout').run();
+});
+TEST_F('CrExtensionsBrowserTest', 'ExtensionSidebarClickHandlerTest',
+       function() {
+  extension_sidebar_tests.registerTests();
+  mocha.grep('test sidebar click handlers').run();
+});
+
 function CrExtensionsBrowserTestWithInstalledExtension() {}
 
 CrExtensionsBrowserTestWithInstalledExtension.prototype = {
diff --git a/chrome/test/data/webui/extensions/extension_sidebar_test.js b/chrome/test/data/webui/extensions/extension_sidebar_test.js
new file mode 100644
index 0000000..a1911871
--- /dev/null
+++ b/chrome/test/data/webui/extensions/extension_sidebar_test.js
@@ -0,0 +1,113 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/** @fileoverview Suite of tests for extension-sidebar. */
+cr.define('extension_sidebar_tests', function() {
+  /** @type {extensions.Sidebar} */
+  var sidebar;
+
+  /**
+   * A mock delegate for the sidebar, capable of testing functionality.
+   * @constructor
+   * @implements {extensions.SidebarDelegate}
+   */
+  function MockDelegate() {}
+
+  MockDelegate.prototype = {
+    /**
+     * Tests clicking on an element and expected a delegate call from the
+     * sidebar.
+     * @param {HTMLElement} element The element to click on.
+     * @param {string} callName The function expected to be called.
+     * @param {Array<?>=} opt_expectedArgs The arguments the function is
+     *     expected to be called with.
+     */
+    testClickingCalls: function(element, callName, opt_expectedArgs) {
+      var mock = new MockController();
+      var mockMethod = mock.createFunctionMock(this, callName);
+      MockMethod.prototype.addExpectation.apply(
+          mockMethod, opt_expectedArgs);
+      MockInteractions.tap(element);
+      mock.verifyMocks();
+    },
+
+    /** @override */
+    setProfileInDevMode: function(inDevMode) {},
+
+    /** @override */
+    loadUnpacked: function() {},
+
+    /** @override */
+    packExtension: function() {},
+
+    /** @override */
+    updateAllExtensions: function() {},
+  };
+
+  /**
+   * Tests that the element's visibility matches |expectedVisible|.
+   * @param {boolean} expectedVisible Whether the element should be
+   *     visible.
+   * @param {string} selector The selector to find the element.
+   */
+  function testVisible(selector, expectedVisible) {
+    var element = sidebar.$$(selector);
+    var rect = element ? element.getBoundingClientRect() : null;
+    var isVisible = !!rect && (rect.width * rect.height > 0);
+    expectEquals(expectedVisible, isVisible, selector);
+  }
+
+  function registerTests() {
+    suite('ExtensionSidebarTest', function() {
+      /** @type {MockDelegate} */
+      var mockDelegate;
+
+      // Import cr_settings_checkbox.html before running suite.
+      suiteSetup(function() {
+        return PolymerTest.importHtml('chrome://extensions/sidebar.html');
+      });
+
+      setup(function() {
+        sidebar = document.querySelector('extensions-manager').sidebar;
+        mockDelegate = new MockDelegate();
+        sidebar.setDelegate(mockDelegate);
+      });
+
+      test('test sidebar layout', function() {
+        testVisible('#load-unpacked', false);
+        testVisible('#pack-extensions', false);
+        testVisible('#update-now', false);
+
+        sidebar.set('inDevMode', true);
+        Polymer.dom.flush();
+
+        testVisible('#load-unpacked', true);
+        testVisible('#pack-extensions', true);
+        testVisible('#update-now', true);
+      });
+
+      test('test sidebar click handlers', function() {
+        sidebar.set('inDevMode', true);
+        Polymer.dom.flush();
+
+        mockDelegate.testClickingCalls(
+            sidebar.$['developer-mode-checkbox'], 'setProfileInDevMode',
+            [false]);
+        mockDelegate.testClickingCalls(
+            sidebar.$['developer-mode-checkbox'], 'setProfileInDevMode',
+            [true]);
+        mockDelegate.testClickingCalls(
+            sidebar.$$('#load-unpacked'), 'loadUnpacked', []);
+        mockDelegate.testClickingCalls(
+            sidebar.$$('#pack-extensions'), 'packExtension', []);
+        mockDelegate.testClickingCalls(
+            sidebar.$$('#update-now'), 'updateAllExtensions', []);
+      });
+    });
+  }
+
+  return {
+    registerTests: registerTests,
+  };
+});
diff --git a/chrome/test/data/webui/media_router/issue_banner_tests.js b/chrome/test/data/webui/media_router/issue_banner_tests.js
index cbcc607..182956746 100644
--- a/chrome/test/data/webui/media_router/issue_banner_tests.js
+++ b/chrome/test/data/webui/media_router/issue_banner_tests.js
@@ -186,22 +186,18 @@
         // The blocking UI should be shown along with an optional action.
         banner.issue = fakeBlockingIssueOne;
         checkButtonVisibility(fakeBlockingIssueOne.secondaryActionType);
-        assertFalse(banner.$['issue-header'].hasAttribute('hidden'));
 
         // The blocking UI should be shown without an optional action.
         banner.issue = fakeBlockingIssueTwo;
         checkButtonVisibility(fakeBlockingIssueTwo.secondaryActionType);
-        assertFalse(banner.$['issue-header'].hasAttribute('hidden'));
 
         // The non-blocking UI should be shown along with an optional action.
         banner.issue = fakeNonBlockingIssueOne;
         checkButtonVisibility(fakeNonBlockingIssueOne.secondaryActionType);
-        assertTrue(banner.$['issue-header'].hasAttribute('hidden'));
 
         // The non-blocking UI should be shown without an optional action.
         banner.issue = fakeNonBlockingIssueTwo;
         checkButtonVisibility(fakeNonBlockingIssueTwo.secondaryActionType);
-        assertTrue(banner.$['issue-header'].hasAttribute('hidden'));
       });
     });
   }
diff --git a/chrome/test/data/webui/media_router/media_router_container_tests.js b/chrome/test/data/webui/media_router/media_router_container_tests.js
index 95d5089e..e26af872 100644
--- a/chrome/test/data/webui/media_router/media_router_container_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_tests.js
@@ -403,8 +403,7 @@
 
         // Set a blocking issue. The issue should stay hidden.
         container.issue = fakeBlockingIssue;
-        checkElementsVisibleWithId(['cast-mode-list',
-                                    'container-header',
+        checkElementsVisibleWithId(['container-header',
                                     'device-missing',
                                     'sink-list']);
       });
@@ -413,7 +412,8 @@
       // Tests for expected visible UI when the view is ROUTE_DETAILS.
       test('route details visibility', function() {
         container.showRouteDetails_();
-        checkElementsVisibleWithId(['device-missing',
+        checkElementsVisibleWithId(['container-header',
+                                    'device-missing',
                                     'route-details',
                                     'sink-list']);
       });
@@ -426,7 +426,8 @@
         // Set a non-blocking issue. The issue should be shown.
         container.issue = fakeNonBlockingIssue;
         setTimeout(function() {
-          checkElementsVisibleWithId(['device-missing',
+          checkElementsVisibleWithId(['container-header',
+                                      'device-missing',
                                       'issue-banner',
                                       'route-details',
                                       'sink-list']);
@@ -443,7 +444,8 @@
         // else, hidden.
         container.issue = fakeBlockingIssue;
         setTimeout(function() {
-          checkElementsVisibleWithId(['device-missing',
+          checkElementsVisibleWithId(['container-header',
+                                      'device-missing',
                                       'issue-banner',
                                       'sink-list']);
           done();
@@ -496,7 +498,9 @@
         // else, hidden.
         container.issue = fakeBlockingIssue;
         setTimeout(function() {
-          checkElementsVisibleWithId(['issue-banner', 'sink-list']);
+          checkElementsVisibleWithId(['container-header',
+                                      'issue-banner',
+                                      'sink-list']);
           done();
         });
       });
diff --git a/chrome/test/data/webui/media_router/route_details_tests.js b/chrome/test/data/webui/media_router/route_details_tests.js
index 1fb53b2e..528f55d 100644
--- a/chrome/test/data/webui/media_router/route_details_tests.js
+++ b/chrome/test/data/webui/media_router/route_details_tests.js
@@ -24,18 +24,6 @@
        */
       var fakeRouteTwo;
 
-      /**
-       * First fake sink created before each test.
-       * @type {media_router.Sink}
-       */
-      var fakeSinkOne;
-
-      /**
-       * Second fake sink created before each test.
-       * @type {media_router.Sink}
-       */
-      var fakeSinkTwo;
-
       // Checks whether |expected| and the text in the span element in
       // the |elementId| element are equal.
       var checkSpanText = function(expected, elementId) {
@@ -79,12 +67,6 @@
             'Video 1', 1, true, 'chrome-extension://123/custom_view.html');
         fakeRouteTwo = new media_router.Route('route id 2', 'sink id 2',
             'Video 2', 2, false);
-        fakeSinkOne = new media_router.Sink('sink id 1', 'Living Room',
-            media_router.SinkIconType.CAST,
-            media_router.SinkStatus.ACTIVE, [0, 1, 2]);
-        fakeSinkTwo = new media_router.Sink('sink id 2', 'my device',
-            media_router.SinkIconType.CAST,
-            media_router.SinkStatus.ACTIVE, [0, 1, 2]);
 
         // Allow for the route details to be created and attached.
         setTimeout(done);
@@ -107,8 +89,8 @@
         checkSpanText('', 'route-information');
       });
 
-      // Tests when |route| exists but |sink| is null.
-      test('route is set', function() {
+      // Tests when |route| is null or set.
+      test('route is null or set', function() {
         // |route| is null.
         assertEquals(null, details.route);
         checkDefaultViewIsShown();
@@ -118,7 +100,6 @@
         assertEquals(fakeRouteOne, details.route);
         checkSpanText(loadTimeData.getStringF('castingActivityStatus',
             fakeRouteOne.description), 'route-information');
-        assertEquals(null, details.sink);
         checkDefaultViewIsShown();
 
         // Set |route| to a different route.
@@ -129,44 +110,7 @@
         checkDefaultViewIsShown();
       });
 
-      // Tests when |sink| exists but |route| is null.
-      test('sink is set', function() {
-        // |sink| is null.
-        assertEquals(null, details.sink);
-        checkSpanText('', 'route-information');
-
-        // Set |sink| to be non-null. 'route-information' should be updated.
-        details.sink = fakeSinkOne;
-        assertEquals(fakeSinkOne, details.sink);
-        assertEquals(null, details.route);
-        checkSpanText('', 'route-information');
-
-        // Set |sink| to be a different sink. 'route-information' text should
-        // be updated.
-        details.sink = fakeSinkTwo;
-        assertEquals(fakeSinkTwo, details.sink);
-        checkSpanText('', 'route-information');
-      });
-
-      // Tests when |route| and |sink| both exist.
-      test('sink and route are set', function() {
-        details.route = fakeRouteOne;
-        details.sink = fakeSinkOne;
-        assertEquals(fakeSinkOne, details.sink);
-        assertEquals(fakeRouteOne, details.route);
-        checkSpanText(loadTimeData.getStringF('castingActivityStatus',
-            fakeRouteOne.description), 'route-information');
-      });
-
-      // Tests when |route| and |sink| are both null.
-      test('sink and route are null', function() {
-        assertEquals(null, details.route);
-        assertEquals(null, details.sink);
-        checkSpanText('', 'route-information');
-      });
-
-      // Tests when |route| and |sink| both exist and |route| has custom
-      // controller and it loads.
+      // Tests when |route| exists, has a custom controller, and it loads.
       test('route has custom controller and loading succeeds', function(done) {
         var loadInvoked = false;
         details.$['custom-controller'].load = function(url) {
@@ -176,7 +120,6 @@
         };
 
         details.route = fakeRouteOne;
-        details.sink = fakeSinkOne;
         setTimeout(function() {
           assertTrue(loadInvoked);
           checkCustomControllerIsShown();
@@ -184,8 +127,7 @@
         });
       });
 
-      // Tests when |route| and |sink| both exist and |route| has custom
-      // controller but it fails to load.
+      // Tests when |route| exists, has a custom controller, but fails to load.
       test('route has custom controller but loading fails', function(done) {
         var loadInvoked = false;
         details.$['custom-controller'].load = function(url) {
@@ -194,7 +136,6 @@
         };
 
         details.route = fakeRouteOne;
-        details.sink = fakeSinkOne;
         setTimeout(function() {
           assertTrue(loadInvoked);
           checkDefaultViewIsShown();
diff --git a/chromecast/browser/media/cma_message_filter_host.cc b/chromecast/browser/media/cma_message_filter_host.cc
index 6de55ad..96136b5f 100644
--- a/chromecast/browser/media/cma_message_filter_host.cc
+++ b/chromecast/browser/media/cma_message_filter_host.cc
@@ -174,11 +174,12 @@
 
   for (MediaPipelineMap::iterator it = media_pipelines_.begin();
        it != media_pipelines_.end(); ) {
+    int media_id = it->first;
     scoped_ptr<MediaPipelineHost> media_pipeline(it->second);
     media_pipelines_.erase(it++);
     task_runner_->PostTask(
         FROM_HERE,
-        base::Bind(&DestroyMediaPipeline, process_id_, it->first,
+        base::Bind(&DestroyMediaPipeline, process_id_, media_id,
                    base::Passed(&media_pipeline)));
   }
 }
diff --git a/chromeos/network/auto_connect_handler.cc b/chromeos/network/auto_connect_handler.cc
index edb8c6d..4665cfe 100644
--- a/chromeos/network/auto_connect_handler.cc
+++ b/chromeos/network/auto_connect_handler.cc
@@ -100,10 +100,12 @@
 }
 
 void AutoConnectHandler::PoliciesApplied(const std::string& userhash) {
-  if (userhash.empty())
+  if (userhash.empty()) {
     device_policy_applied_ = true;
-  else
+  } else {
     user_policy_applied_ = true;
+    DisconnectIfPolicyRequires();
+  }
 
   // Request to connect to the best network only if there is at least one
   // managed network. Otherwise only process existing requests.
@@ -194,8 +196,10 @@
 }
 
 void AutoConnectHandler::DisconnectIfPolicyRequires() {
-  if (applied_autoconnect_policy_ || !LoginState::Get()->IsUserLoggedIn())
+  if (applied_autoconnect_policy_ || !LoginState::Get()->IsUserLoggedIn() ||
+      !user_policy_applied_) {
     return;
+  }
 
   const base::DictionaryValue* global_network_config =
       managed_configuration_handler_->GetGlobalConfigFromPolicy(
diff --git a/chromeos/network/auto_connect_handler.h b/chromeos/network/auto_connect_handler.h
index 26444dc..6d990be 100644
--- a/chromeos/network/auto_connect_handler.h
+++ b/chromeos/network/auto_connect_handler.h
@@ -58,11 +58,11 @@
   // If the user logged in already and the policy to prevent unmanaged & shared
   // networks to autoconnect is enabled, then disconnects all such networks
   // except wired networks. It will do this only once after the user logged in
-  // and the device policy was available.
+  // and the device policy and user policy was available.
   // This is enforced once after a user logs in 1) to allow mananged networks to
   // autoconnect and 2) to prevent a previous user from foisting a network on
   // the new user. Therefore, this function is called at login and when the
-  // device policy is changed.
+  // device policy is changed after user policy is fetched and applied.
   void DisconnectIfPolicyRequires();
 
   // Disconnects from all unmanaged and shared WiFi networks that are currently
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc
index 1143108..9749ee4 100644
--- a/chromeos/network/auto_connect_handler_unittest.cc
+++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -407,6 +407,12 @@
   // Because no best service is set, the fake implementation of
   // ConnectToBestServices will be a no-op.
   SetupPolicy(kPolicy, global_config, false /* load as device policy */);
+
+  // Should not trigger any change until user policy is loaded
+  EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0"));
+  EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
+
+  SetupPolicy(std::string(), base::DictionaryValue(), true);
   EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0"));
   EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1"));
 }
diff --git a/components/BUILD.gn b/components/BUILD.gn
index cb34a370..6ee2cb5 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -126,7 +126,7 @@
       "//components/security_interstitials/core",
       "//components/signin/core/browser",
       "//components/ssl_config",
-      "//components/startup_metric_utils",
+      "//components/startup_metric_utils/browser",
       "//components/sync_driver",
       "//components/sync_sessions",
       "//components/tracing",
diff --git a/components/bookmarks.gypi b/components/bookmarks.gypi
index 4894b69..69d5b589 100644
--- a/components/bookmarks.gypi
+++ b/components/bookmarks.gypi
@@ -26,7 +26,6 @@
         'keyed_service_core',
         'pref_registry',
         'query_parser',
-        'startup_metric_utils',
         'url_formatter/url_formatter.gyp:url_formatter',
       ],
       'sources': [
diff --git a/components/bookmarks/DEPS b/components/bookmarks/DEPS
index 75997b1..1871065 100644
--- a/components/bookmarks/DEPS
+++ b/components/bookmarks/DEPS
@@ -3,7 +3,6 @@
   "+components/keyed_service",
   "+components/pref_registry",
   "+components/query_parser",
-  "+components/startup_metric_utils",
   "+components/url_formatter",
   "+grit/components_strings.h",
   "+jni",
diff --git a/components/bookmarks/browser/BUILD.gn b/components/bookmarks/browser/BUILD.gn
index 97f5065..c0ec3b2 100644
--- a/components/bookmarks/browser/BUILD.gn
+++ b/components/bookmarks/browser/BUILD.gn
@@ -50,7 +50,6 @@
     "//components/keyed_service/core",
     "//components/pref_registry",
     "//components/query_parser",
-    "//components/startup_metric_utils",
     "//components/strings",
     "//components/url_formatter",
     "//net",
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc
index db81950..660cefa 100644
--- a/components/content_settings/core/browser/host_content_settings_map.cc
+++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -251,32 +251,70 @@
   NOTREACHED();
 }
 
-void HostContentSettingsMap::SetNarrowestWebsiteSetting(
-    const ContentSettingsPattern& primary_pattern,
-    const ContentSettingsPattern& secondary_pattern,
-    ContentSettingsType content_type,
-    const std::string& resource_identifier,
-    ContentSetting setting,
-    content_settings::SettingInfo existing_info) {
+void HostContentSettingsMap::SetNarrowestContentSetting(
+    const GURL& primary_url,
+    const GURL& secondary_url,
+    ContentSettingsType type,
+    ContentSetting setting) {
+  // TODO(raymes): The scoping here should be a property of ContentSettingsInfo.
+  // Make this happen! crbug.com/444742.
+  ContentSettingsPattern primary_pattern;
+  ContentSettingsPattern secondary_pattern;
+  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
+      type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX ||
+      type == CONTENT_SETTINGS_TYPE_FULLSCREEN) {
+    // TODO(markusheintz): The rule we create here should also change the
+    // location permission for iframed content.
+    primary_pattern = ContentSettingsPattern::FromURLNoWildcard(primary_url);
+    secondary_pattern =
+        ContentSettingsPattern::FromURLNoWildcard(secondary_url);
+  } else if (type == CONTENT_SETTINGS_TYPE_IMAGES ||
+             type == CONTENT_SETTINGS_TYPE_JAVASCRIPT ||
+             type == CONTENT_SETTINGS_TYPE_PLUGINS ||
+             type == CONTENT_SETTINGS_TYPE_POPUPS ||
+             type == CONTENT_SETTINGS_TYPE_MOUSELOCK ||
+             type == CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS ||
+             type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) {
+    primary_pattern = ContentSettingsPattern::FromURL(primary_url);
+    secondary_pattern = ContentSettingsPattern::Wildcard();
+  } else if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
+             type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA ||
+             type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
+    primary_pattern = ContentSettingsPattern::FromURLNoWildcard(primary_url);
+    secondary_pattern = ContentSettingsPattern::Wildcard();
+  } else {
+    NOTREACHED() << "ContentSettingsType " << type << "is not supported.";
+  }
+
+  // Permission settings are specified via rules. There exists always at least
+  // one rule for the default setting. Get the rule that currently defines
+  // the permission for the given permission |type|. Then test whether the
+  // existing rule is more specific than the rule we are about to create. If
+  // the existing rule is more specific, than change the existing rule instead
+  // of creating a new rule that would be hidden behind the existing rule.
+  content_settings::SettingInfo info;
+  scoped_ptr<base::Value> v =
+      GetWebsiteSetting(primary_url, secondary_url, type, std::string(), &info);
+  DCHECK_EQ(content_settings::SETTING_SOURCE_USER, info.source);
+
   ContentSettingsPattern narrow_primary = primary_pattern;
   ContentSettingsPattern narrow_secondary = secondary_pattern;
 
-  DCHECK_EQ(content_settings::SETTING_SOURCE_USER, existing_info.source);
   ContentSettingsPattern::Relation r1 =
-      existing_info.primary_pattern.Compare(primary_pattern);
+      info.primary_pattern.Compare(primary_pattern);
   if (r1 == ContentSettingsPattern::PREDECESSOR) {
-    narrow_primary = existing_info.primary_pattern;
+    narrow_primary = info.primary_pattern;
   } else if (r1 == ContentSettingsPattern::IDENTITY) {
     ContentSettingsPattern::Relation r2 =
-        existing_info.secondary_pattern.Compare(secondary_pattern);
+        info.secondary_pattern.Compare(secondary_pattern);
     DCHECK(r2 != ContentSettingsPattern::DISJOINT_ORDER_POST &&
            r2 != ContentSettingsPattern::DISJOINT_ORDER_PRE);
     if (r2 == ContentSettingsPattern::PREDECESSOR)
-      narrow_secondary = existing_info.secondary_pattern;
+      narrow_secondary = info.secondary_pattern;
   }
 
-  SetContentSetting(
-      narrow_primary, narrow_secondary, content_type, std::string(), setting);
+  SetContentSetting(narrow_primary, narrow_secondary, type, std::string(),
+                    setting);
 }
 
 void HostContentSettingsMap::SetContentSetting(
@@ -390,32 +428,6 @@
   GetPrefProvider()->SetClockForTesting(clock.Pass());
 }
 
-void HostContentSettingsMap::AddExceptionForURL(
-    const GURL& primary_url,
-    const GURL& secondary_url,
-    ContentSettingsType content_type,
-    ContentSetting setting) {
-  // TODO(markusheintz): Until the UI supports pattern pairs, both urls must
-  // match.
-  DCHECK(primary_url == secondary_url);
-  DCHECK(content_settings::ContentSettingsRegistry::GetInstance()->Get(
-      content_type));
-
-  // Make sure there is no entry that would override the pattern we are about
-  // to insert for exactly this URL.
-  SetContentSetting(ContentSettingsPattern::FromURLNoWildcard(primary_url),
-                    ContentSettingsPattern::Wildcard(),
-                    content_type,
-                    std::string(),
-                    CONTENT_SETTING_DEFAULT);
-
-  SetContentSetting(ContentSettingsPattern::FromURL(primary_url),
-                    ContentSettingsPattern::Wildcard(),
-                    content_type,
-                    std::string(),
-                    setting);
-}
-
 void HostContentSettingsMap::ClearSettingsForOneType(
     ContentSettingsType content_type) {
   UsedContentSettingsProviders();
diff --git a/components/content_settings/core/browser/host_content_settings_map.h b/components/content_settings/core/browser/host_content_settings_map.h
index 79c22bc..e7a1a49 100644
--- a/components/content_settings/core/browser/host_content_settings_map.h
+++ b/components/content_settings/core/browser/host_content_settings_map.h
@@ -152,24 +152,15 @@
                          const std::string& resource_identifier,
                          base::Value* value);
 
-  // Sets the most specific rule that currently defines the permission for the
-  // given permission type.
-  void SetNarrowestWebsiteSetting(
-      const ContentSettingsPattern& primary_pattern,
-      const ContentSettingsPattern& secondary_pattern,
-      ContentSettingsType content_type,
-      const std::string& resource_identifier,
-      ContentSetting setting,
-      content_settings::SettingInfo existing_info);
-
-  // Convenience method to add a content setting for the given URLs, making sure
-  // that there is no setting overriding it.
-  //
-  // This should only be called on the UI thread.
-  void AddExceptionForURL(const GURL& primary_url,
-                          const GURL& secondary_url,
-                          ContentSettingsType content_type,
-                          ContentSetting setting);
+  // Sets the most specific rule that currently defines the setting for the
+  // given content type. TODO(raymes): Remove this once all content settings
+  // are scoped to origin scope. There is no scope more narrow than origin
+  // scope, so we can just blindly set the value of the origin scope when that
+  // happens.
+  void SetNarrowestContentSetting(const GURL& primary_url,
+                                  const GURL& secondary_url,
+                                  ContentSettingsType type,
+                                  ContentSetting setting);
 
   // Clears all host-specific settings for one content type.
   //
diff --git a/components/devtools_http_handler/devtools_http_handler.cc b/components/devtools_http_handler/devtools_http_handler.cc
index e4af63d..63727fd 100644
--- a/components/devtools_http_handler/devtools_http_handler.cc
+++ b/components/devtools_http_handler/devtools_http_handler.cc
@@ -377,6 +377,9 @@
   } else if (base::EndsWith(filename, ".json",
                             base::CompareCase::INSENSITIVE_ASCII)) {
     return "application/json";
+  } else if (base::EndsWith(filename, ".svg",
+                            base::CompareCase::INSENSITIVE_ASCII)) {
+    return "image/svg+xml";
   }
   LOG(ERROR) << "GetMimeType doesn't know mime type for: "
              << filename
diff --git a/components/feedback/tracing_manager.cc b/components/feedback/tracing_manager.cc
index 04bf1b1..462000a5 100644
--- a/components/feedback/tracing_manager.cc
+++ b/components/feedback/tracing_manager.cc
@@ -95,7 +95,9 @@
       content::TracingController::EnableRecordingDoneCallback());
 }
 
-void TracingManager::OnTraceDataCollected(base::RefCountedString* trace_data) {
+void TracingManager::OnTraceDataCollected(
+    scoped_ptr<const base::DictionaryValue> metadata,
+    base::RefCountedString* trace_data) {
   if (!current_trace_id_)
     return;
 
diff --git a/components/feedback/tracing_manager.h b/components/feedback/tracing_manager.h
index e846f37..27e4e49 100644
--- a/components/feedback/tracing_manager.h
+++ b/components/feedback/tracing_manager.h
@@ -12,6 +12,7 @@
 #include "base/callback.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/values.h"
 
 namespace base {
 
@@ -58,7 +59,8 @@
   TracingManager();
 
   void StartTracing();
-  void OnTraceDataCollected(base::RefCountedString* data);
+  void OnTraceDataCollected(scoped_ptr<const base::DictionaryValue> metadata,
+                            base::RefCountedString* data);
 
   // ID of the trace that is being collected.
   int current_trace_id_;
diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc
index 3ba8c436..994a3fd 100644
--- a/components/gcm_driver/gcm_client_impl_unittest.cc
+++ b/components/gcm_driver/gcm_client_impl_unittest.cc
@@ -373,6 +373,10 @@
   }
 
  private:
+  // Must be declared first so that it is destroyed last. Injected to
+  // GCM client.
+  base::ScopedTempDir temp_directory_;
+
   // Variables used for verification.
   LastEvent last_event_;
   std::string last_app_id_;
@@ -391,8 +395,7 @@
   scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
   base::ThreadTaskRunnerHandle task_runner_handle_;
 
-  // Injected to GCM client:
-  base::ScopedTempDir temp_directory_;
+  // Injected to GCM client.
   scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
 };
 
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc
index 564ab65..ed6028c 100644
--- a/components/guest_view/browser/guest_view_base.cc
+++ b/components/guest_view/browser/guest_view_base.cc
@@ -46,7 +46,8 @@
 
 // This observer ensures that the GuestViewBase destroys itself when its
 // embedder goes away. It also tracks when the embedder's fullscreen is
-// toggled so the guest can change itself accordingly.
+// toggled or when its page scale factor changes so the guest can change
+// itself accordingly.
 class GuestViewBase::OwnerContentsObserver : public WebContentsObserver {
  public:
   OwnerContentsObserver(GuestViewBase* guest,
@@ -100,6 +101,13 @@
     }
   }
 
+  void OnPageScaleFactorChanged(float page_scale_factor) override {
+    if (destroyed_)
+      return;
+
+    guest_->web_contents()->SetPageScale(page_scale_factor);
+  }
+
  private:
   bool is_fullscreen_;
   bool destroyed_;
diff --git a/components/history/core/browser/history_client.h b/components/history/core/browser/history_client.h
index 9c186b6..27e0414 100644
--- a/components/history/core/browser/history_client.h
+++ b/components/history/core/browser/history_client.h
@@ -5,9 +5,7 @@
 #ifndef COMPONENTS_HISTORY_CORE_BROWSER_HISTORY_CLIENT_H_
 #define COMPONENTS_HISTORY_CORE_BROWSER_HISTORY_CLIENT_H_
 
-#include "base/callback_forward.h"
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "sql/init_status.h"
 
@@ -15,7 +13,6 @@
 
 namespace base {
 class FilePath;
-class SequencedTaskRunner;
 }
 
 namespace history {
@@ -46,11 +43,6 @@
   // Notifies the embedder that there was a problem reading the database.
   virtual void NotifyProfileError(sql::InitStatus init_status) = 0;
 
-  // Hands the task to the embedder so it can post the task after startup.
-  virtual void PostAfterStartupTask(
-      const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-      const base::Closure& task) = 0;
-
   // Returns a new HistoryBackendClient instance.
   virtual scoped_ptr<HistoryBackendClient> CreateBackendClient() = 0;
 
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
index c0e9536..f72305a 100644
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.cc
@@ -24,7 +24,6 @@
 #include "base/compiler_specific.h"
 #include "base/location.h"
 #include "base/memory/ref_counted.h"
-#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/thread_task_runner_handle.h"
@@ -337,7 +336,7 @@
   // Use base::ThreadTaskRunnerHandler::Get() to get a message loop proxy to
   // the current message loop so that we can forward the call to the method
   // HistoryDBTask::DoneRunOnMainThread() in the correct thread.
-  after_startup_task_runner_->PostTask(
+  thread_->task_runner()->PostTask(
       FROM_HERE, base::Bind(&HistoryBackend::ProcessDBTask,
                             history_backend_.get(), base::Passed(&task),
                             base::ThreadTaskRunnerHandle::Get(), is_canceled));
@@ -345,7 +344,7 @@
 }
 
 void HistoryService::FlushForTest(const base::Closure& flushed) {
-  after_startup_task_runner_->PostTaskAndReply(
+  thread_->task_runner()->PostTaskAndReply(
       FROM_HERE, base::Bind(&base::DoNothing), flushed);
 }
 
@@ -363,7 +362,7 @@
   DCHECK(thread_) << "History service being called after cleanup";
   DCHECK(thread_checker_.CalledOnValidThread());
   PostTaskAndReplyWithResult(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::TopHosts, history_backend_.get(), num_hosts),
       callback);
 }
@@ -526,7 +525,7 @@
   std::vector<favicon_base::FaviconRawBitmapResult>* results =
       new std::vector<favicon_base::FaviconRawBitmapResult>();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::GetFavicons, history_backend_.get(),
                  icon_urls, icon_types, desired_sizes, results),
       base::Bind(&RunWithFaviconResults, callback, base::Owned(results)));
@@ -543,7 +542,7 @@
   std::vector<favicon_base::FaviconRawBitmapResult>* results =
       new std::vector<favicon_base::FaviconRawBitmapResult>();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::GetFaviconsForURL, history_backend_.get(),
                  page_url, icon_types, desired_sizes, results),
       base::Bind(&RunWithFaviconResults, callback, base::Owned(results)));
@@ -560,7 +559,7 @@
   favicon_base::FaviconRawBitmapResult* result =
       new favicon_base::FaviconRawBitmapResult();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::GetLargestFaviconForURL,
                  history_backend_.get(), page_url, icon_types,
                  minimum_size_in_pixels, result),
@@ -577,7 +576,7 @@
   std::vector<favicon_base::FaviconRawBitmapResult>* results =
       new std::vector<favicon_base::FaviconRawBitmapResult>();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::GetFaviconForID, history_backend_.get(),
                  favicon_id, desired_size, results),
       base::Bind(&RunWithFaviconResults, callback, base::Owned(results)));
@@ -596,7 +595,7 @@
   std::vector<favicon_base::FaviconRawBitmapResult>* results =
       new std::vector<favicon_base::FaviconRawBitmapResult>();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::UpdateFaviconMappingsAndFetch,
                  history_backend_.get(), page_url, icon_urls, icon_types,
                  desired_sizes, results),
@@ -660,7 +659,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   QueryURLResult* query_url_result = new QueryURLResult();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::QueryURL, history_backend_.get(), url,
                  want_visits, base::Unretained(query_url_result)),
       base::Bind(&RunWithQueryURLResult, callback,
@@ -695,7 +694,7 @@
     const HistoryService::DownloadCreateCallback& callback) {
   DCHECK(thread_) << "History service being called after cleanup";
   DCHECK(thread_checker_.CalledOnValidThread());
-  PostTaskAndReplyWithResult(after_startup_task_runner_.get(), FROM_HERE,
+  PostTaskAndReplyWithResult(thread_->task_runner().get(), FROM_HERE,
                              base::Bind(&HistoryBackend::CreateDownload,
                                         history_backend_.get(), create_info),
                              callback);
@@ -705,7 +704,7 @@
   DCHECK(thread_) << "History service being called after cleanup";
   DCHECK(thread_checker_.CalledOnValidThread());
   PostTaskAndReplyWithResult(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::GetNextDownloadId, history_backend_.get()),
       callback);
 }
@@ -721,7 +720,7 @@
   // base::Passed(&scoped_rows) nullifies |scoped_rows|, and compilers do not
   // guarantee that the first Bind's arguments are evaluated before the second
   // Bind's arguments.
-  after_startup_task_runner_->PostTaskAndReply(
+  thread_->task_runner()->PostTaskAndReply(
       FROM_HERE,
       base::Bind(&HistoryBackend::QueryDownloads, history_backend_.get(), rows),
       base::Bind(callback, base::Passed(&scoped_rows)));
@@ -752,7 +751,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   QueryResults* query_results = new QueryResults();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::QueryHistory, history_backend_.get(),
                  text_query, options, base::Unretained(query_results)),
       base::Bind(callback, base::Owned(query_results)));
@@ -766,7 +765,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   RedirectList* result = new RedirectList();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::QueryRedirectsFrom, history_backend_.get(),
                  from_url, base::Unretained(result)),
       base::Bind(callback, base::Owned(result)));
@@ -780,7 +779,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   RedirectList* result = new RedirectList();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::QueryRedirectsTo, history_backend_.get(),
                  to_url, base::Unretained(result)),
       base::Bind(callback, base::Owned(result)));
@@ -794,7 +793,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   VisibleVisitCountToHostResult* result = new VisibleVisitCountToHostResult();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::GetVisibleVisitCountToHost,
                  history_backend_.get(), url, base::Unretained(result)),
       base::Bind(&RunWithVisibleVisitCountToHostResult, callback,
@@ -810,7 +809,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   MostVisitedURLList* result = new MostVisitedURLList();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::QueryMostVisitedURLs, history_backend_.get(),
                  result_count, days_back, base::Unretained(result)),
       base::Bind(callback, base::Owned(result)));
@@ -826,7 +825,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   FilteredURLList* result = new FilteredURLList();
   return tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::QueryFilteredURLs, history_backend_.get(),
                  result_count, filter, extended_info, base::Unretained(result)),
       base::Bind(callback, base::Owned(result)));
@@ -906,22 +905,6 @@
     return false;
   }
 
-  DCHECK(!after_startup_task_runner_);
-  after_startup_task_runner_ =
-      new base::DeferredSequencedTaskRunner(thread_->task_runner().get());
-
-  base::FieldTrial* trial = base::FieldTrialList::Find("LightSpeed");
-  if (history_client_ && trial &&
-      base::StartsWith(trial->group_name(), "HistoryServiceDelayed",
-                       base::CompareCase::SENSITIVE)) {
-    history_client_->PostAfterStartupTask(
-        base::ThreadTaskRunnerHandle::Get(),
-        base::Bind(&HistoryService::OnStartupComplete,
-                   weak_ptr_factory_.GetWeakPtr()));
-  } else {
-    OnStartupComplete();
-  }
-
   // Create the history backend.
   scoped_refptr<HistoryBackend> backend(new HistoryBackend(
       new BackendDelegate(weak_ptr_factory_.GetWeakPtr(),
@@ -956,7 +939,7 @@
   CHECK(thread_);
   CHECK(thread_->message_loop());
   // TODO(brettw): Do prioritization.
-  after_startup_task_runner_->PostTask(FROM_HERE, task);
+  thread_->task_runner()->PostTask(FROM_HERE, task);
 }
 
 base::WeakPtr<HistoryService> HistoryService::AsWeakPtr() {
@@ -1020,11 +1003,6 @@
     history_client_->NotifyProfileError(init_status);
 }
 
-void HistoryService::OnStartupComplete() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  after_startup_task_runner_->Start();
-}
-
 void HistoryService::DeleteURL(const GURL& url) {
   DCHECK(thread_) << "History service being called after cleanup";
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -1051,7 +1029,7 @@
   DCHECK(thread_) << "History service being called after cleanup";
   DCHECK(thread_checker_.CalledOnValidThread());
   tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::ExpireHistoryBetween, history_backend_,
                  restrict_urls, begin_time, end_time),
       callback);
@@ -1064,7 +1042,7 @@
   DCHECK(thread_) << "History service being called after cleanup";
   DCHECK(thread_checker_.CalledOnValidThread());
   tracker->PostTaskAndReply(
-      after_startup_task_runner_.get(), FROM_HERE,
+      thread_->task_runner().get(), FROM_HERE,
       base::Bind(&HistoryBackend::ExpireHistory, history_backend_, expire_list),
       callback);
 }
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h
index 62267e1..94fafaa8 100644
--- a/components/history/core/browser/history_service.h
+++ b/components/history/core/browser/history_service.h
@@ -13,7 +13,6 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_list.h"
-#include "base/deferred_sequenced_task_runner.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
@@ -801,9 +800,6 @@
   // Called by our BackendDelegate when there is a problem reading the database.
   void NotifyProfileError(sql::InitStatus init_status);
 
-  // Kicks off the |after_startup_task_runner_|.
-  void OnStartupComplete();
-
   // Call to schedule a given task for running on the history thread with the
   // specified priority. The task will have ownership taken.
   void ScheduleTask(SchedulePriority priority, const base::Closure& task);
@@ -830,10 +826,6 @@
   // more calls should be made to the history thread.
   scoped_refptr<HistoryBackend> history_backend_;
 
-  // A DeferredSequencedTaskRunner that queues up all tasks that should be
-  // performed after startup.
-  scoped_refptr<base::DeferredSequencedTaskRunner> after_startup_task_runner_;
-
   // A cache of the user-typed URLs kept in memory that is used by the
   // autocomplete system. This will be null until the database has been created
   // on the background thread.
diff --git a/components/history/core/test/history_client_fake_bookmarks.cc b/components/history/core/test/history_client_fake_bookmarks.cc
index fe4a9177..ceed15f 100644
--- a/components/history/core/test/history_client_fake_bookmarks.cc
+++ b/components/history/core/test/history_client_fake_bookmarks.cc
@@ -6,8 +6,6 @@
 
 #include <map>
 
-#include "base/location.h"
-#include "base/sequenced_task_runner.h"
 #include "base/synchronization/lock.h"
 #include "components/history/core/browser/history_backend_client.h"
 #include "url/gurl.h"
@@ -176,12 +174,6 @@
     sql::InitStatus init_status) {
 }
 
-void HistoryClientFakeBookmarks::PostAfterStartupTask(
-    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-    const base::Closure& task) {
-  task_runner->PostTask(FROM_HERE, task);
-}
-
 scoped_ptr<HistoryBackendClient>
 HistoryClientFakeBookmarks::CreateBackendClient() {
   return make_scoped_ptr(new HistoryBackendClientFakeBookmarks(bookmarks_));
diff --git a/components/history/core/test/history_client_fake_bookmarks.h b/components/history/core/test/history_client_fake_bookmarks.h
index 9beb89d..b14f3925 100644
--- a/components/history/core/test/history_client_fake_bookmarks.h
+++ b/components/history/core/test/history_client_fake_bookmarks.h
@@ -34,9 +34,6 @@
   void Shutdown() override;
   bool CanAddURL(const GURL& url) override;
   void NotifyProfileError(sql::InitStatus init_status) override;
-  void PostAfterStartupTask(
-      const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-      const base::Closure& task) override;
   scoped_ptr<HistoryBackendClient> CreateBackendClient() override;
 
  private:
diff --git a/components/html_viewer/BUILD.gn b/components/html_viewer/BUILD.gn
index 0940bc89..dc5b228 100644
--- a/components/html_viewer/BUILD.gn
+++ b/components/html_viewer/BUILD.gn
@@ -163,7 +163,7 @@
     "//components/resource_provider/public/cpp",
     "//components/resource_provider/public/interfaces",
     "//components/scheduler:scheduler",
-    "//components/startup_metric_utils",
+    "//components/startup_metric_utils/browser",
     "//components/webcrypto",
     "//components/web_view:switches",
     "//components/web_view/public/interfaces",
diff --git a/components/html_viewer/DEPS b/components/html_viewer/DEPS
index e87124c6..3ba0df9 100644
--- a/components/html_viewer/DEPS
+++ b/components/html_viewer/DEPS
@@ -10,7 +10,7 @@
   "+components/mus",
   "+components/resource_provider/public",
   "+components/scheduler",
-  "+components/startup_metric_utils",
+  "+components/startup_metric_utils/browser",
   "+components/webcrypto",
   "+components/web_view/public/interfaces",
   "+components/web_view/test_runner/public/interfaces",
diff --git a/components/html_viewer/media_factory.cc b/components/html_viewer/media_factory.cc
index 4d155d3..64426c1 100644
--- a/components/html_viewer/media_factory.cc
+++ b/components/html_viewer/media_factory.cc
@@ -160,7 +160,7 @@
   return audio_hardware_config_;
 }
 
-scoped_refptr<media::AudioRendererSink>
+scoped_refptr<media::RestartableAudioRendererSink>
 MediaFactory::CreateAudioRendererSink() {
   // TODO(dalecurtis): Replace this with an interface to an actual mojo service;
   // the AudioOutputStreamSink will not work in sandboxed processes.
diff --git a/components/html_viewer/media_factory.h b/components/html_viewer/media_factory.h
index 70d1f7d..edae380 100644
--- a/components/html_viewer/media_factory.h
+++ b/components/html_viewer/media_factory.h
@@ -30,7 +30,7 @@
 
 namespace media {
 class AudioManager;
-class AudioRendererSink;
+class RestartableAudioRendererSink;
 class CdmFactory;
 class MediaPermission;
 class WebEncryptedMediaClientImpl;
@@ -70,7 +70,7 @@
 
 #if !defined(OS_ANDROID)
   const media::AudioHardwareConfig& GetAudioHardwareConfig();
-  scoped_refptr<media::AudioRendererSink> CreateAudioRendererSink();
+  scoped_refptr<media::RestartableAudioRendererSink> CreateAudioRendererSink();
   scoped_refptr<base::SingleThreadTaskRunner> GetMediaThreadTaskRunner();
 
   base::Thread media_thread_;
diff --git a/components/html_viewer/stats_collection_controller.cc b/components/html_viewer/stats_collection_controller.cc
index 70ab672..8abc09a7 100644
--- a/components/html_viewer/stats_collection_controller.cc
+++ b/components/html_viewer/stats_collection_controller.cc
@@ -9,7 +9,7 @@
 #include "base/metrics/histogram.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/time/time.h"
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "gin/handle.h"
 #include "gin/object_template_builder.h"
 #include "mojo/application/public/cpp/application_impl.h"
diff --git a/components/mus/example/main/main_application_delegate.cc b/components/mus/example/main/main_application_delegate.cc
index 864340b..cd98f4e 100644
--- a/components/mus/example/main/main_application_delegate.cc
+++ b/components/mus/example/main/main_application_delegate.cc
@@ -16,6 +16,7 @@
   connections_.push_back(app->ConnectToApplication("mojo:views_examples"));
   connections_.push_back(
       app->ConnectToApplication("exe:window_type_launcher_exe"));
+  connections_.push_back(app->ConnectToApplication("exe:chrome"));
 }
 
 bool MainApplicationDelegate::ConfigureIncomingConnection(
diff --git a/components/mus/example/wm/window_manager_application.cc b/components/mus/example/wm/window_manager_application.cc
index 67e56ee..ef3d8c87 100644
--- a/components/mus/example/wm/window_manager_application.cc
+++ b/components/mus/example/wm/window_manager_application.cc
@@ -37,7 +37,8 @@
   mus::mojom::WindowManagerPtr window_manager;
   requests_.push_back(new mojo::InterfaceRequest<mus::mojom::WindowManager>(
       mojo::GetProxy(&window_manager)));
-  mus::CreateSingleWindowTreeHost(app, this, &host_, window_manager.Pass());
+  mus::CreateSingleWindowTreeHost(app, this, &host_, window_manager.Pass(),
+                                  this);
 }
 
 bool WindowManagerApplication::ConfigureIncomingConnection(
@@ -93,6 +94,12 @@
   root_ = nullptr;
 }
 
+bool WindowManagerApplication::OnWmSetBounds(mus::Window* window,
+                                             gfx::Rect* bounds) {
+  // By returning true the bounds of |window| is updated.
+  return true;
+}
+
 void WindowManagerApplication::CreateContainers() {
   for (uint16_t container =
            static_cast<uint16_t>(ash::mojom::CONTAINER_ALL_USER_BACKGROUND);
diff --git a/components/mus/example/wm/window_manager_application.h b/components/mus/example/wm/window_manager_application.h
index 635e1004..377fa96 100644
--- a/components/mus/example/wm/window_manager_application.h
+++ b/components/mus/example/wm/window_manager_application.h
@@ -10,6 +10,7 @@
 #include "base/memory/scoped_vector.h"
 #include "components/mus/example/wm/public/interfaces/container.mojom.h"
 #include "components/mus/public/cpp/types.h"
+#include "components/mus/public/cpp/window_manager_delegate.h"
 #include "components/mus/public/cpp/window_observer.h"
 #include "components/mus/public/cpp/window_tree_delegate.h"
 #include "components/mus/public/interfaces/window_manager.mojom.h"
@@ -37,7 +38,9 @@
     : public mojo::ApplicationDelegate,
       public mus::WindowObserver,
       public mus::WindowTreeDelegate,
-      public mojo::InterfaceFactory<mus::mojom::WindowManager> {
+      public mojo::InterfaceFactory<mus::mojom::WindowManager>,
+      // TODO(sky): make WindowManagerImpl implement this.
+      public mus::WindowManagerDelegate {
  public:
   WindowManagerApplication();
   ~WindowManagerApplication() override;
@@ -70,6 +73,9 @@
   // mus::WindowObserver:
   void OnWindowDestroyed(mus::Window* window) override;
 
+  // WindowManagerDelegate:
+  bool OnWmSetBounds(mus::Window* window, gfx::Rect* bounds) override;
+
   // Sets up the window containers used for z-space management.
   void CreateContainers();
 
diff --git a/components/mus/example/wm/window_manager_impl.cc b/components/mus/example/wm/window_manager_impl.cc
index 5cc668da..6dc2c0bf 100644
--- a/components/mus/example/wm/window_manager_impl.cc
+++ b/components/mus/example/wm/window_manager_impl.cc
@@ -94,18 +94,6 @@
                    : mus::mojom::WINDOW_MANAGER_ERROR_CODE_ERROR_ACCESS_DENIED);
 }
 
-void WindowManagerImpl::SetBounds(
-    mus::Id window_id,
-    mojo::RectPtr bounds,
-    const WindowManagerErrorCodeCallback& callback) {
-  mus::Window* window = state_->root()->GetChildById(window_id);
-  if (window)
-    window->SetBounds(bounds->To<gfx::Rect>());
-  callback.Run(window
-                   ? mus::mojom::WINDOW_MANAGER_ERROR_CODE_SUCCESS
-                   : mus::mojom::WINDOW_MANAGER_ERROR_CODE_ERROR_ACCESS_DENIED);
-}
-
 void WindowManagerImpl::SetShowState(
     mus::Id window_id,
     mus::mojom::ShowState show_state,
diff --git a/components/mus/example/wm/window_manager_impl.h b/components/mus/example/wm/window_manager_impl.h
index b956fae..934f751 100644
--- a/components/mus/example/wm/window_manager_impl.h
+++ b/components/mus/example/wm/window_manager_impl.h
@@ -33,9 +33,6 @@
       mus::Id window_id,
       mojo::SizePtr size,
       const WindowManagerErrorCodeCallback& callback) override;
-  void SetBounds(mus::Id window_id,
-                 mojo::RectPtr bounds,
-                 const WindowManagerErrorCodeCallback& callback) override;
   void SetShowState(mus::Id window_id,
                     mus::mojom::ShowState show_state,
                     const WindowManagerErrorCodeCallback& callback) override;
diff --git a/components/mus/public/cpp/BUILD.gn b/components/mus/public/cpp/BUILD.gn
index 69712a0d..26ef227 100644
--- a/components/mus/public/cpp/BUILD.gn
+++ b/components/mus/public/cpp/BUILD.gn
@@ -8,6 +8,8 @@
     "event_matcher.h",
     "lib/context_provider.cc",
     "lib/event_matcher.cc",
+    "lib/in_flight_change.cc",
+    "lib/in_flight_change.h",
     "lib/output_surface.cc",
     "lib/property_type_converters.cc",
     "lib/scoped_window_ptr.cc",
@@ -24,6 +26,7 @@
     "property_type_converters.h",
     "scoped_window_ptr.h",
     "window.h",
+    "window_manager_delegate.h",
     "window_observer.h",
     "window_property.h",
     "window_surface.h",
diff --git a/components/mus/public/cpp/lib/in_flight_change.cc b/components/mus/public/cpp/lib/in_flight_change.cc
new file mode 100644
index 0000000..114b497
--- /dev/null
+++ b/components/mus/public/cpp/lib/in_flight_change.cc
@@ -0,0 +1,36 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mus/public/cpp/lib/in_flight_change.h"
+
+#include "components/mus/public/cpp/lib/window_private.h"
+#include "components/mus/public/cpp/window_tree_connection.h"
+
+namespace mus {
+
+InFlightChange::InFlightChange(Id window_id, ChangeType type)
+    : window_id_(window_id), change_type_(type) {}
+
+InFlightChange::~InFlightChange() {}
+
+InFlightBoundsChange::InFlightBoundsChange(WindowTreeConnection* tree,
+                                           Id window_id,
+                                           const gfx::Rect& revert_bounds)
+    : InFlightChange(window_id, ChangeType::BOUNDS),
+      tree_(tree),
+      revert_bounds_(revert_bounds) {}
+
+void InFlightBoundsChange::PreviousChangeCompleted(InFlightChange* change,
+                                                   bool success) {
+  if (!success)
+    revert_bounds_ = static_cast<InFlightBoundsChange*>(change)->revert_bounds_;
+}
+
+void InFlightBoundsChange::Revert() {
+  Window* window = tree_->GetWindowById(window_id());
+  if (window)
+    WindowPrivate(window).LocalSetBounds(window->bounds(), revert_bounds_);
+}
+
+}  // namespace mus
diff --git a/components/mus/public/cpp/lib/in_flight_change.h b/components/mus/public/cpp/lib/in_flight_change.h
new file mode 100644
index 0000000..6856c72f
--- /dev/null
+++ b/components/mus/public/cpp/lib/in_flight_change.h
@@ -0,0 +1,83 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MUS_PUBLIC_CPP_LIB_IN_FLIGHT_CHANGE_H_
+#define COMPONENTS_MUS_PUBLIC_CPP_LIB_IN_FLIGHT_CHANGE_H_
+
+#include "base/macros.h"
+#include "components/mus/public/cpp/types.h"
+#include "ui/gfx/geometry/rect.h"
+
+namespace mus {
+
+class WindowTreeConnection;
+
+enum class ChangeType {
+  BOUNDS,
+};
+
+// InFlightChange is used to track function calls to the server and take the
+// appropriate action when the call fails, or the same property changes while
+// waiting for the response. When a function is called on the server an
+// InFlightChange is created. The function call is complete when
+// OnChangeCompleted() is sent back from the server. The following may occur
+// while waiting for a response:
+// . A new value is encountered from the server. For example, the bounds of
+//   a window is locally changed and while waiting for the ack from the server
+//   OnWindowBoundsChanged() is received.
+//   When this occurs the new value from the server is set as the value to
+//   revert should the server respond that the call failed.
+// . While waiting for the ack the property is again modified locally. When
+//   this happens a new InFlightChange is created. Once the ack for the first
+//   call is received PreviousChangeCompleted() is invoked with the result from
+//   the server on the second InFlightChange. This allows the new change to
+//   update the value to revert should the second call fail.
+// . If the server responds that the call failed and there is not another
+//   InFlightChange for the same window outstanding, then Revert() is called
+//   to revert the value.
+class InFlightChange {
+ public:
+  InFlightChange(Id window_id, ChangeType type);
+  virtual ~InFlightChange();
+
+  Id window_id() const { return window_id_; }
+  ChangeType change_type() const { return change_type_; }
+
+  // Called when a previous change associated with the same window and type
+  // has completed. |success| is true if the change completed successfully,
+  // false if the change failed.
+  virtual void PreviousChangeCompleted(InFlightChange* change,
+                                       bool success) = 0;
+
+  // The change failed and there is no pending change of the same type
+  // outstanding, revert the value.
+  virtual void Revert() = 0;
+
+ private:
+  const Id window_id_;
+  const ChangeType change_type_;
+};
+
+class InFlightBoundsChange : public InFlightChange {
+ public:
+  InFlightBoundsChange(WindowTreeConnection* tree,
+                       Id window_id,
+                       const gfx::Rect& revert_bounds);
+
+  void set_revert_bounds(const gfx::Rect& bounds) { revert_bounds_ = bounds; }
+
+  // InFlightChange:
+  void PreviousChangeCompleted(InFlightChange* change, bool success) override;
+  void Revert() override;
+
+ private:
+  WindowTreeConnection* tree_;
+  gfx::Rect revert_bounds_;
+
+  DISALLOW_COPY_AND_ASSIGN(InFlightBoundsChange);
+};
+
+}  // namespace mus
+
+#endif  // COMPONENTS_MUS_PUBLIC_CPP_LIB_IN_FLIGHT_CHANGE_H_
diff --git a/components/mus/public/cpp/lib/window.cc b/components/mus/public/cpp/lib/window.cc
index 7d960fd..3fede87 100644
--- a/components/mus/public/cpp/lib/window.cc
+++ b/components/mus/public/cpp/lib/window.cc
@@ -210,7 +210,8 @@
   if (bounds_ == bounds)
     return;
   if (connection_)
-    static_cast<WindowTreeClientImpl*>(connection_)->SetBounds(id_, bounds);
+    static_cast<WindowTreeClientImpl*>(connection_)
+        ->SetBounds(id_, bounds_, bounds);
   LocalSetBounds(bounds_, bounds);
 }
 
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.cc b/components/mus/public/cpp/lib/window_tree_client_impl.cc
index 3bff852..f781ac3 100644
--- a/components/mus/public/cpp/lib/window_tree_client_impl.cc
+++ b/components/mus/public/cpp/lib/window_tree_client_impl.cc
@@ -5,8 +5,10 @@
 #include "components/mus/public/cpp/lib/window_tree_client_impl.h"
 
 #include "base/bind.h"
+#include "components/mus/public/cpp/lib/in_flight_change.h"
 #include "components/mus/public/cpp/lib/window_private.h"
 #include "components/mus/public/cpp/util.h"
+#include "components/mus/public/cpp/window_manager_delegate.h"
 #include "components/mus/public/cpp/window_observer.h"
 #include "components/mus/public/cpp/window_tree_connection.h"
 #include "components/mus/public/cpp/window_tree_delegate.h"
@@ -84,7 +86,19 @@
     mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request,
     CreateType create_type) {
   WindowTreeClientImpl* client =
-      new WindowTreeClientImpl(delegate, request.Pass());
+      new WindowTreeClientImpl(delegate, nullptr, request.Pass());
+  if (create_type == CreateType::WAIT_FOR_EMBED)
+    client->WaitForEmbed();
+  return client;
+}
+
+WindowTreeConnection* WindowTreeConnection::CreateForWindowManager(
+    WindowTreeDelegate* delegate,
+    mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request,
+    CreateType create_type,
+    WindowManagerDelegate* window_manager_delegate) {
+  WindowTreeClientImpl* client = new WindowTreeClientImpl(
+      delegate, window_manager_delegate, request.Pass());
   if (create_type == CreateType::WAIT_FOR_EMBED)
     client->WaitForEmbed();
   return client;
@@ -92,14 +106,15 @@
 
 WindowTreeClientImpl::WindowTreeClientImpl(
     WindowTreeDelegate* delegate,
+    WindowManagerDelegate* window_manager_delegate,
     mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request)
     : connection_id_(0),
-      next_id_(1),
+      next_window_id_(1),
+      next_change_id_(1),
       delegate_(delegate),
+      window_manager_delegate_(window_manager_delegate),
       root_(nullptr),
-      capture_window_(nullptr),
       focused_window_(nullptr),
-      activated_window_(nullptr),
       binding_(this, request.Pass()),
       is_embed_root_(false),
       in_destructor_(false) {}
@@ -162,24 +177,17 @@
   return HiWord(id) == connection_id_;
 }
 
-void WindowTreeClientImpl::SetBounds(Id window_id, const gfx::Rect& bounds) {
+void WindowTreeClientImpl::SetBounds(Id window_id,
+                                     const gfx::Rect& old_bounds,
+                                     const gfx::Rect& bounds) {
   DCHECK(tree_);
-  Window* window = GetWindowById(window_id);
-  tree_->SetWindowBounds(
-      window_id, mojo::Rect::From(bounds),
-      base::Bind(&WindowTreeClientImpl::OnSetBoundsResponse,
-                 base::Unretained(this), window_id, bounds, window->bounds()));
-}
-
-void WindowTreeClientImpl::OnSetBoundsResponse(
-    Id window_id,
-    const gfx::Rect& requested_bounds,
-    const gfx::Rect& real_bounds,
-    bool success) {
-  if (success)
-    return;
-  Window* window = GetWindowById(window_id);
-  WindowPrivate(window).LocalSetBounds(requested_bounds, real_bounds);
+  const uint32_t change_id = next_change_id_++;
+  {
+    scoped_ptr<InFlightBoundsChange> change(
+        new InFlightBoundsChange(this, window_id, old_bounds));
+    in_flight_map_.set(change_id, change.Pass());
+  }
+  tree_->SetWindowBounds(change_id, window_id, mojo::Rect::From(bounds));
 }
 
 void WindowTreeClientImpl::SetClientArea(Id window_id,
@@ -253,6 +261,15 @@
   IdToWindowMap::iterator it = windows_.find(window_id);
   if (it != windows_.end())
     windows_.erase(it);
+
+  // Remove any InFlightChanges associated with the window.
+  std::set<uint32_t> in_flight_change_ids;
+  for (const auto& pair : in_flight_map_) {
+    if (pair.second->window_id() == window_id)
+      in_flight_change_ids.insert(pair.first);
+  }
+  for (auto change_id : in_flight_change_ids)
+    in_flight_map_.erase(change_id);
 }
 
 void WindowTreeClientImpl::OnRootDestroyed(Window* root) {
@@ -287,13 +304,28 @@
 
 Id WindowTreeClientImpl::CreateWindowOnServer() {
   DCHECK(tree_);
-  const Id window_id = MakeTransportId(connection_id_, next_id_++);
+  const Id window_id = MakeTransportId(connection_id_, next_window_id_++);
   tree_->NewWindow(window_id, [this](mojom::ErrorCode code) {
     OnActionCompleted(code == mojom::ERROR_CODE_NONE);
   });
   return window_id;
 }
 
+InFlightChange* WindowTreeClientImpl::GetOldestInFlightChangeMatching(
+    Id window_id,
+    ChangeType change_type) {
+  for (auto& pair : in_flight_map_) {
+    if (pair.second->window_id() == window_id &&
+        pair.second->change_type() == change_type) {
+      return pair.second;
+    }
+  }
+  return nullptr;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// WindowTreeClientImpl, WindowTreeConnection implementation:
+
 Window* WindowTreeClientImpl::GetRoot() {
   return root_;
 }
@@ -363,6 +395,16 @@
 void WindowTreeClientImpl::OnWindowBoundsChanged(Id window_id,
                                                  mojo::RectPtr old_bounds,
                                                  mojo::RectPtr new_bounds) {
+  InFlightChange* change =
+      GetOldestInFlightChangeMatching(window_id, ChangeType::BOUNDS);
+  if (change) {
+    static_cast<InFlightBoundsChange*>(change)
+        ->set_revert_bounds(old_bounds.To<gfx::Rect>());
+    // Wait for the change we initiated on the server to complete before
+    // deciding if |new_bounds| should be applied.
+    return;
+  }
+
   Window* window = GetWindowById(window_id);
   WindowPrivate(window)
       .LocalSetBounds(old_bounds.To<gfx::Rect>(), new_bounds.To<gfx::Rect>());
@@ -499,6 +541,38 @@
   }
 }
 
+void WindowTreeClientImpl::OnChangeCompleted(uint32 change_id, bool success) {
+  scoped_ptr<InFlightChange> change(in_flight_map_.take_and_erase(change_id));
+  if (!change)
+    return;
+
+  InFlightChange* next_change = GetOldestInFlightChangeMatching(
+      change->window_id(), change->change_type());
+  if (next_change)
+    next_change->PreviousChangeCompleted(change.get(), success);
+  else if (!success)
+    change->Revert();
+}
+
+void WindowTreeClientImpl::WmSetBounds(uint32 change_id,
+                                       uint32 window_id,
+                                       mojo::RectPtr transit_bounds) {
+  Window* window = GetWindowById(window_id);
+  bool result = false;
+  if (window) {
+    DCHECK(window_manager_delegate_);
+    gfx::Rect bounds = transit_bounds.To<gfx::Rect>();
+    result = window_manager_delegate_->OnWmSetBounds(window, &bounds);
+    if (result) {
+      // If the resulting bounds differ return false. Returning false ensures
+      // the client applies the bounds we set below.
+      result = bounds == transit_bounds.To<gfx::Rect>();
+      window->SetBounds(bounds);
+    }
+  }
+  tree_->WmResponse(change_id, result);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // WindowTreeClientImpl, private:
 
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.h b/components/mus/public/cpp/lib/window_tree_client_impl.h
index 97a2e07..99b19a3 100644
--- a/components/mus/public/cpp/lib/window_tree_client_impl.h
+++ b/components/mus/public/cpp/lib/window_tree_client_impl.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_MUS_PUBLIC_CPP_LIB_WINDOW_TREE_CLIENT_IMPL_H_
 #define COMPONENTS_MUS_PUBLIC_CPP_LIB_WINDOW_TREE_CLIENT_IMPL_H_
 
+#include "base/containers/scoped_ptr_map.h"
 #include "components/mus/public/cpp/types.h"
 #include "components/mus/public/cpp/window.h"
 #include "components/mus/public/cpp/window_tree_connection.h"
@@ -17,15 +18,19 @@
 }
 
 namespace mus {
+class InFlightChange;
 class WindowTreeConnection;
 class WindowTreeDelegate;
 
+enum class ChangeType;
+
 // Manages the connection with the Window Server service.
 class WindowTreeClientImpl : public WindowTreeConnection,
                              public mus::mojom::WindowTreeClient {
  public:
   WindowTreeClientImpl(
       WindowTreeDelegate* delegate,
+      WindowManagerDelegate* window_manager_delegate,
       mojo::InterfaceRequest<mus::mojom::WindowTreeClient> request);
   ~WindowTreeClientImpl() override;
 
@@ -52,7 +57,9 @@
   // Returns true if the specified window was created by this connection.
   bool OwnsWindow(Id id) const;
 
-  void SetBounds(Id window_id, const gfx::Rect& bounds);
+  void SetBounds(Id window_id,
+                 const gfx::Rect& old_bounds,
+                 const gfx::Rect& bounds);
   void SetClientArea(Id window_id, const gfx::Insets& client_area);
   void SetFocus(Id window_id);
   void SetVisible(Id window_id, bool visible);
@@ -98,12 +105,13 @@
  private:
   typedef std::map<Id, Window*> IdToWindowMap;
 
+  using InFlightMap = base::ScopedPtrMap<uint32_t, scoped_ptr<InFlightChange>>;
+
   Id CreateWindowOnServer();
 
-  void OnSetBoundsResponse(Id window_id,
-                           const gfx::Rect& requested_bounds,
-                           const gfx::Rect& real_bounds,
-                           bool success);
+  // Returns the oldest InFlightChange matching the supplied arguments.
+  InFlightChange* GetOldestInFlightChangeMatching(Id window_id,
+                                                  ChangeType change_type);
 
   // Overridden from WindowTreeConnection:
   Window* GetRoot() override;
@@ -148,27 +156,37 @@
                           mojom::EventPtr event,
                           const mojo::Callback<void()>& callback) override;
   void OnWindowFocused(Id focused_window_id) override;
-
-  void RootDestroyed(Window* root);
+  void OnChangeCompleted(uint32 change_id, bool success) override;
+  void WmSetBounds(uint32 change_id,
+                   uint32 window_id,
+                   mojo::RectPtr transit_bounds) override;
 
   void OnActionCompleted(bool success);
 
   mojo::Callback<void(bool)> ActionCompletedCallback();
 
+  // This is set once and only once when we get OnEmbed(). It gives the unique
+  // id for this connection.
   ConnectionSpecificId connection_id_;
-  ConnectionSpecificId next_id_;
+
+  // Id assigned to the next window created.
+  ConnectionSpecificId next_window_id_;
+
+  // Id used for the next change id supplied to the server.
+  uint32_t next_change_id_;
+  InFlightMap in_flight_map_;
 
   mojo::Callback<void(void)> change_acked_callback_;
 
   WindowTreeDelegate* delegate_;
 
+  WindowManagerDelegate* window_manager_delegate_;
+
   Window* root_;
 
   IdToWindowMap windows_;
 
-  Window* capture_window_;
   Window* focused_window_;
-  Window* activated_window_;
 
   mojo::Binding<WindowTreeClient> binding_;
   mus::mojom::WindowTreePtr tree_;
diff --git a/components/mus/public/cpp/lib/window_tree_host_factory.cc b/components/mus/public/cpp/lib/window_tree_host_factory.cc
index 092aa8c6..80de37ff 100644
--- a/components/mus/public/cpp/lib/window_tree_host_factory.cc
+++ b/components/mus/public/cpp/lib/window_tree_host_factory.cc
@@ -14,25 +14,30 @@
                           mojom::WindowTreeHostClientPtr host_client,
                           WindowTreeDelegate* delegate,
                           mojom::WindowTreeHostPtr* host,
-                          mojom::WindowManagerPtr window_manager) {
+                          mojom::WindowManagerPtr window_manager,
+                          WindowManagerDelegate* window_manager_delegate) {
   mojom::WindowTreeClientPtr tree_client;
-  WindowTreeConnection::Create(
+  WindowTreeConnection::CreateForWindowManager(
       delegate, GetProxy(&tree_client),
-      WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED);
+      WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED,
+      window_manager_delegate);
   factory->CreateWindowTreeHost(GetProxy(host), host_client.Pass(),
                                 tree_client.Pass(), window_manager.Pass());
 }
 
-void CreateSingleWindowTreeHost(mojo::ApplicationImpl* app,
-                                WindowTreeDelegate* delegate,
-                                mojom::WindowTreeHostPtr* host,
-                                mojom::WindowManagerPtr window_manager) {
+void CreateSingleWindowTreeHost(
+    mojo::ApplicationImpl* app,
+    WindowTreeDelegate* delegate,
+    mojom::WindowTreeHostPtr* host,
+    mojom::WindowManagerPtr window_manager,
+    WindowManagerDelegate* window_manager_delegate) {
   mojom::WindowTreeHostFactoryPtr factory;
   mojo::URLRequestPtr request(mojo::URLRequest::New());
   request->url = "mojo:mus";
   app->ConnectToService(request.Pass(), &factory);
   CreateWindowTreeHost(factory.get(), mojom::WindowTreeHostClientPtr(),
-                       delegate, host, window_manager.Pass());
+                       delegate, host, window_manager.Pass(),
+                       window_manager_delegate);
 }
 
 }  // namespace mus
diff --git a/components/mus/public/cpp/tests/window_server_test_base.cc b/components/mus/public/cpp/tests/window_server_test_base.cc
index d3d64ea..02d9e12 100644
--- a/components/mus/public/cpp/tests/window_server_test_base.cc
+++ b/components/mus/public/cpp/tests/window_server_test_base.cc
@@ -63,7 +63,8 @@
 void WindowServerTestBase::SetUp() {
   ApplicationTestBase::SetUp();
 
-  CreateSingleWindowTreeHost(application_impl(), this, &host_, nullptr);
+  CreateSingleWindowTreeHost(application_impl(), this, &host_, nullptr,
+                             nullptr);
 
   ASSERT_TRUE(DoRunLoopWithTimeout());  // RunLoop should be quit by OnEmbed().
   std::swap(window_manager_, most_recent_connection_);
diff --git a/components/mus/public/cpp/window_manager_delegate.h b/components/mus/public/cpp/window_manager_delegate.h
new file mode 100644
index 0000000..a6504ac
--- /dev/null
+++ b/components/mus/public/cpp/window_manager_delegate.h
@@ -0,0 +1,34 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MUS_PUBLIC_CPP_WINDOW_MANAGER_DELEGATE_H_
+#define COMPONENTS_MUS_PUBLIC_CPP_WINDOW_MANAGER_DELEGATE_H_
+
+namespace gfx {
+class Rect;
+}
+
+namespace mus {
+
+class Window;
+
+// Used by clients implementing a window manager.
+// TODO(sky): this should be called WindowManager, but that's rather confusing
+// currently.
+class WindowManagerDelegate {
+ public:
+  // A client requested the bounds of |window| to change to |bounds|. Return
+  // true if the bounds are allowed to change. A return value of false
+  // indicates the change is not allowed.
+  // NOTE: This should not change the bounds of |window|. Instead return the
+  // bounds the window should be in |bounds|.
+  virtual bool OnWmSetBounds(Window* window, gfx::Rect* bounds) = 0;
+
+ protected:
+  virtual ~WindowManagerDelegate() {}
+};
+
+}  // namespace mus
+
+#endif  // COMPONENTS_MUS_PUBLIC_CPP_WINDOW_MANAGER_DELEGATE_H_
diff --git a/components/mus/public/cpp/window_tree_connection.h b/components/mus/public/cpp/window_tree_connection.h
index e3ecd63..821bdc31 100644
--- a/components/mus/public/cpp/window_tree_connection.h
+++ b/components/mus/public/cpp/window_tree_connection.h
@@ -14,6 +14,7 @@
 namespace mus {
 
 class Window;
+class WindowManagerDelegate;
 class WindowTreeDelegate;
 
 // Encapsulates a connection to a window tree. A unique connection is made
@@ -37,6 +38,12 @@
       mojo::InterfaceRequest<mojom::WindowTreeClient> request,
       CreateType create_type);
 
+  static WindowTreeConnection* CreateForWindowManager(
+      WindowTreeDelegate* delegate,
+      mojo::InterfaceRequest<mojom::WindowTreeClient> request,
+      CreateType create_type,
+      WindowManagerDelegate* window_manager_delegate);
+
   // Returns the root of this connection.
   virtual Window* GetRoot() = 0;
 
diff --git a/components/mus/public/cpp/window_tree_host_factory.h b/components/mus/public/cpp/window_tree_host_factory.h
index e94f0bd9..af8d25b 100644
--- a/components/mus/public/cpp/window_tree_host_factory.h
+++ b/components/mus/public/cpp/window_tree_host_factory.h
@@ -18,6 +18,7 @@
 
 namespace mus {
 
+class WindowManagerDelegate;
 class WindowTreeDelegate;
 
 // Uses |factory| to create a new |host|, providing the supplied |host_client|
@@ -26,14 +27,16 @@
                           mojom::WindowTreeHostClientPtr host_client,
                           WindowTreeDelegate* delegate,
                           mojom::WindowTreeHostPtr* host,
-                          mojom::WindowManagerPtr window_manager);
+                          mojom::WindowManagerPtr window_manager,
+                          WindowManagerDelegate* window_manager_delegate);
 
 // Creates a single host with no client by connecting to the window manager
 // application. Useful only for tests and trivial UIs.
 void CreateSingleWindowTreeHost(mojo::ApplicationImpl* app,
                                 WindowTreeDelegate* delegate,
                                 mojom::WindowTreeHostPtr* host,
-                                mojom::WindowManagerPtr window_manager);
+                                mojom::WindowManagerPtr window_manager,
+                                WindowManagerDelegate* window_manager_delegate);
 
 }  // namespace mus
 
diff --git a/components/mus/public/interfaces/window_manager.mojom b/components/mus/public/interfaces/window_manager.mojom
index 97e0292..3f26b70 100644
--- a/components/mus/public/interfaces/window_manager.mojom
+++ b/components/mus/public/interfaces/window_manager.mojom
@@ -36,9 +36,6 @@
   SetPreferredSize(uint32 window_id, mojo.Size size) =>
       (WindowManagerErrorCode result);
 
-  SetBounds(uint32 window_id, mojo.Rect bounds) =>
-      (WindowManagerErrorCode result);
-
   SetShowState(uint32 window_id, ShowState show_state) =>
       (WindowManagerErrorCode result);
 
diff --git a/components/mus/public/interfaces/window_tree.mojom b/components/mus/public/interfaces/window_tree.mojom
index 7c2f99c..834b60c9 100644
--- a/components/mus/public/interfaces/window_tree.mojom
+++ b/components/mus/public/interfaces/window_tree.mojom
@@ -55,6 +55,15 @@
 // and the lower 16 the id assigned by the client.
 //
 // The root window is identified with a connection id of 0, and value of 1.
+//
+// Most functions to the WindowTree take a change_id parameter. When
+// WindowTree completes processing of a function WindowTree calls
+// WindowTreeClient::OnChangeCompleted() with the change_id supplied by the
+// client and the result of the function. This allows the client to track
+// whether the call succeeded or not. Calls are done via the client interface
+// rather than a callback to ensure ordering. The server does not interpret the
+// change id in anyway, it is up to the client to assign a value and use it.
+// Generally the change id is an ever increasing integer.
 interface WindowTree {
   enum AccessPolicy {
     DEFAULT = 0,
@@ -88,7 +97,7 @@
   DeleteWindow(uint32 window_id) => (bool success);
 
   // Sets the specified bounds of the specified window.
-  SetWindowBounds(uint32 window_id, mojo.Rect bounds) => (bool success);
+  SetWindowBounds(uint32 change_id, uint32 window_id, mojo.Rect bounds);
 
   // Sets the insets of the client area of the specified window.
   SetClientArea(uint32 window_id, mojo.Insets insets);
@@ -197,6 +206,13 @@
   SetShowState(uint32 window_id, ShowState show_state) =>
       (WindowManagerErrorCode result);
   SetResizeBehavior(uint32 window_id, ResizeBehavior resize_behavior);
+
+  // --------------------------------------------------------------------------
+  // This section is for functions called from the window manager. It is
+  // expected these will be pulled into an associated interface.
+
+  // The window manager has completed a request with the specific change id.
+  WmResponse(uint32 change_id, bool response);
 };
 
 // Changes to windows are not sent to the connection that originated the
@@ -282,4 +298,16 @@
   OnWindowInputEvent(uint32 window, Event event) => ();
 
   OnWindowFocused(uint32 focused_window_id);
+
+  // A change initiated from the client has completed. See description of
+  // change ids for details.
+  OnChangeCompleted(uint32 change_id, bool success);
+
+  // --------------------------------------------------------------------------
+  // This section is for functions that are expected to be pulled into the
+  // WindowManager interface once we get associated interfaces.
+
+  // Calls to SetWindowBounds() for windows owned by the window manager end up
+  // here. The window manager should reply with WmResponse() as appropriate.
+  WmSetBounds(uint32 change_id, uint32 window_id, mojo.Rect bounds);
 };
diff --git a/components/mus/ws/connection_manager.cc b/components/mus/ws/connection_manager.cc
index c7cebb1..ce627549 100644
--- a/components/mus/ws/connection_manager.cc
+++ b/components/mus/ws/connection_manager.cc
@@ -31,7 +31,8 @@
       next_connection_id_(1),
       next_host_id_(0),
       current_operation_(nullptr),
-      in_destructor_(false) {}
+      in_destructor_(false),
+      next_wm_change_id_(0) {}
 
 ConnectionManager::~ConnectionManager() {
   in_destructor_ = true;
@@ -87,9 +88,18 @@
   connection_map_.erase(connection->service()->id());
 
   // Notify remaining connections so that they can cleanup.
-  for (auto& pair : connection_map_) {
+  for (auto& pair : connection_map_)
     pair.second->service()->OnWillDestroyWindowTreeImpl(connection->service());
+
+  // Remove any requests from the client that resulted in a call to the window
+  // manager and we haven't gotten a response back yet.
+  std::set<uint32_t> to_remove;
+  for (auto& pair : in_flight_wm_change_map_) {
+    if (pair.second.connection_id == connection->service()->id())
+      to_remove.insert(pair.first);
   }
+  for (uint32_t id : to_remove)
+    in_flight_wm_change_map_.erase(id);
 }
 
 void ConnectionManager::OnHostConnectionClosed(
@@ -230,6 +240,31 @@
   return nullptr;
 }
 
+uint32_t ConnectionManager::GenerateWindowManagerChangeId(
+    WindowTreeImpl* source,
+    uint32_t client_change_id) {
+  const uint32_t wm_change_id = next_wm_change_id_++;
+  in_flight_wm_change_map_[wm_change_id] = {source->id(), client_change_id};
+  return wm_change_id;
+}
+
+void ConnectionManager::WindowManagerChangeCompleted(
+    uint32_t window_manager_change_id,
+    bool success) {
+  // There are valid reasons as to why we wouldn't know about the id. The
+  // most likely is the client disconnected before the response from the window
+  // manager came back.
+  auto iter = in_flight_wm_change_map_.find(window_manager_change_id);
+  if (iter == in_flight_wm_change_map_.end())
+    return;
+
+  const InFlightWindowManagerChange change = iter->second;
+  in_flight_wm_change_map_.erase(iter);
+
+  WindowTreeImpl* connection = GetConnection(change.connection_id);
+  connection->client()->OnChangeCompleted(change.client_change_id, success);
+}
+
 void ConnectionManager::ProcessWindowBoundsChanged(
     const ServerWindow* window,
     const gfx::Rect& old_bounds,
diff --git a/components/mus/ws/connection_manager.h b/components/mus/ws/connection_manager.h
index e16b44a..b56156d 100644
--- a/components/mus/ws/connection_manager.h
+++ b/components/mus/ws/connection_manager.h
@@ -117,8 +117,18 @@
   // Returns the first ancestor of |service| that is marked as an embed root.
   WindowTreeImpl* GetEmbedRoot(WindowTreeImpl* service);
 
-  // WindowTreeHost implementation helper; see mojom for details.
-  bool CloneAndAnimate(const WindowId& window_id);
+  // Returns a change id for the window manager that is associated with
+  // |source| and |client_change_id|. When the window manager replies
+  // WindowManagerChangeCompleted() is called to obtain the original source
+  // and client supplied change_id that initiated the called.
+  uint32_t GenerateWindowManagerChangeId(WindowTreeImpl* source,
+                                         uint32_t client_change_id);
+
+  // Called when a response from the window manager is obtained. Calls to
+  // the client that initiated the change with the change id originally
+  // supplied by the client.
+  void WindowManagerChangeCompleted(uint32_t window_manager_change_id,
+                                    bool success);
 
   // These functions trivially delegate to all WindowTreeImpls, which in
   // term notify their clients.
@@ -149,6 +159,17 @@
   using HostConnectionMap =
       std::map<WindowTreeHostImpl*, WindowTreeHostConnection*>;
 
+  struct InFlightWindowManagerChange {
+    // Identifies the client that initiated the change.
+    ConnectionSpecificId connection_id;
+
+    // Change id supplied by the client.
+    uint32_t client_change_id;
+  };
+
+  using InFlightWindowManagerChangeMap =
+      std::map<uint32_t, InFlightWindowManagerChange>;
+
   // Invoked when a connection is about to execute a window server operation.
   // Subsequently followed by FinishOperation() once the change is done.
   //
@@ -222,6 +243,13 @@
 
   bool in_destructor_;
 
+  // Maps from window manager change id to the client that initiated the
+  // request.
+  InFlightWindowManagerChangeMap in_flight_wm_change_map_;
+
+  // Next id supplied to the window manager.
+  uint32_t next_wm_change_id_;
+
   DISALLOW_COPY_AND_ASSIGN(ConnectionManager);
 };
 
diff --git a/components/mus/ws/window_tree_apptest.cc b/components/mus/ws/window_tree_apptest.cc
index 0e5e0ad..09ad12a 100644
--- a/components/mus/ws/window_tree_apptest.cc
+++ b/components/mus/ws/window_tree_apptest.cc
@@ -13,6 +13,7 @@
 #include "mojo/application/public/cpp/application_delegate.h"
 #include "mojo/application/public/cpp/application_impl.h"
 #include "mojo/application/public/cpp/application_test_base.h"
+#include "mojo/converters/geometry/geometry_type_converters.h"
 
 using mojo::ApplicationConnection;
 using mojo::ApplicationDelegate;
@@ -162,20 +163,6 @@
   return result;
 }
 
-bool SetWindowBounds(WindowTree* ws, Id window_id, int x, int y, int w, int h) {
-  base::RunLoop run_loop;
-  bool result = false;
-  RectPtr rect(mojo::Rect::New());
-  rect->x = x;
-  rect->y = y;
-  rect->width = w;
-  rect->height = h;
-  ws->SetWindowBounds(window_id, rect.Pass(),
-                      base::Bind(&BoolResultCallback, &run_loop, &result));
-  run_loop.Run();
-  return result;
-}
-
 bool SetWindowVisibility(WindowTree* ws, Id window_id, bool visible) {
   base::RunLoop run_loop;
   bool result = false;
@@ -233,7 +220,12 @@
                                  public TestChangeTracker::Delegate {
  public:
   explicit TestWindowTreeClientImpl(mojo::ApplicationImpl* app)
-      : binding_(this), app_(app), connection_id_(0), root_window_id_(0) {
+      : binding_(this),
+        app_(app),
+        connection_id_(0),
+        root_window_id_(0),
+        waiting_change_id_(0),
+        on_change_completed_result_(false) {
     tracker_.set_delegate(this);
   }
 
@@ -270,6 +262,13 @@
     return binding_.WaitForIncomingMethodCall();
   }
 
+  bool WaitForChangeCompleted(uint32_t id) {
+    waiting_change_id_ = id;
+    change_completed_run_loop_.reset(new base::RunLoop);
+    change_completed_run_loop_->Run();
+    return on_change_completed_result_;
+  }
+
   Id NewWindow(ConnectionSpecificId window_id) {
     ErrorCode result = ERROR_CODE_NONE;
     base::RunLoop run_loop;
@@ -371,6 +370,15 @@
   }
   // TODO(sky): add testing coverage.
   void OnWindowFocused(uint32_t focused_window_id) override {}
+  void OnChangeCompleted(uint32_t change_id, bool success) override {
+    if (waiting_change_id_ == change_id && change_completed_run_loop_) {
+      on_change_completed_result_ = success;
+      change_completed_run_loop_->Quit();
+    }
+  }
+  void WmSetBounds(uint32_t change_id,
+                   Id window_id,
+                   mojo::RectPtr bounds) override {}
 
   TestChangeTracker tracker_;
 
@@ -387,6 +395,9 @@
   mojo::ApplicationImpl* app_;
   Id connection_id_;
   Id root_window_id_;
+  uint32_t waiting_change_id_;
+  bool on_change_completed_result_;
+  scoped_ptr<base::RunLoop> change_completed_run_loop_;
 
   DISALLOW_COPY_AND_ASSIGN(TestWindowTreeClientImpl);
 };
@@ -1142,7 +1153,10 @@
   ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false));
 
   changes2()->clear();
-  ASSERT_TRUE(SetWindowBounds(ws1(), window_1_1, 0, 0, 100, 100));
+
+  ws1()->SetWindowBounds(10, window_1_1,
+                         mojo::Rect::From(gfx::Rect(0, 0, 100, 100)));
+  ASSERT_TRUE(ws_client1()->WaitForChangeCompleted(10));
 
   ws_client2_->WaitForChangeCount(1);
   EXPECT_EQ("BoundsChanged window=" + IdToString(window_1_1) +
@@ -1151,7 +1165,9 @@
 
   // Should not be possible to change the bounds of a window created by another
   // connection.
-  ASSERT_FALSE(SetWindowBounds(ws2(), window_1_1, 0, 0, 0, 0));
+  ws2()->SetWindowBounds(11, window_1_1,
+                         mojo::Rect::From(gfx::Rect(0, 0, 0, 0)));
+  ASSERT_FALSE(ws_client2()->WaitForChangeCompleted(11));
 }
 
 // Verify AddWindow fails when trying to manipulate windows in other roots.
diff --git a/components/mus/ws/window_tree_impl.cc b/components/mus/ws/window_tree_impl.cc
index 0564c2c..48aaa20 100644
--- a/components/mus/ws/window_tree_impl.cc
+++ b/components/mus/ws/window_tree_impl.cc
@@ -29,11 +29,6 @@
 
 namespace ws {
 
-void RunWMCallback(const Callback<void(bool)>& callback,
-                   mojom::WindowManagerErrorCode error_code) {
-  callback.Run(error_code == mojom::WINDOW_MANAGER_ERROR_CODE_SUCCESS);
-}
-
 WindowTreeImpl::WindowTreeImpl(ConnectionManager* connection_manager,
                                ConnectionSpecificId creator_id,
                                const WindowId& root_id,
@@ -117,6 +112,13 @@
     root_.reset();
 }
 
+void WindowTreeImpl::NotifyChangeCompleted(
+    uint32_t change_id,
+    mojom::WindowManagerErrorCode error_code) {
+  client_->OnChangeCompleted(
+      change_id, error_code == mojom::WINDOW_MANAGER_ERROR_CODE_SUCCESS);
+}
+
 mojom::ErrorCode WindowTreeImpl::NewWindow(const WindowId& window_id) {
   if (window_id.connection_id != id_)
     return mojom::ERROR_CODE_ILLEGAL_ARGUMENT;
@@ -624,13 +626,15 @@
   callback.Run(WindowsToWindowDatas(windows));
 }
 
-void WindowTreeImpl::SetWindowBounds(Id window_id,
-                                     mojo::RectPtr bounds,
-                                     const Callback<void(bool)>& callback) {
+void WindowTreeImpl::SetWindowBounds(uint32_t change_id,
+                                     Id window_id,
+                                     mojo::RectPtr bounds) {
   ServerWindow* window = GetWindow(WindowIdFromTransportId(window_id));
   if (window && ShouldRouteToWindowManager(window)) {
-    GetHost()->window_manager()->SetBounds(
-        window_id, bounds.Pass(), base::Bind(&RunWMCallback, callback));
+    const uint32_t wm_change_id =
+        connection_manager_->GenerateWindowManagerChangeId(this, change_id);
+    GetHost()->GetWindowTree()->client_->WmSetBounds(wm_change_id, window_id,
+                                                     bounds.Pass());
     return;
   }
 
@@ -640,7 +644,7 @@
     Operation op(this, connection_manager_, OperationType::SET_WINDOW_BOUNDS);
     window->SetBounds(bounds.To<gfx::Rect>());
   }
-  callback.Run(success);
+  client_->OnChangeCompleted(change_id, success);
 }
 
 void WindowTreeImpl::SetWindowVisibility(Id transport_window_id,
@@ -766,6 +770,11 @@
     GetHost()->window_manager()->SetResizeBehavior(window_id, resize_behavior);
 }
 
+void WindowTreeImpl::WmResponse(uint32 change_id, bool response) {
+  if (GetHost() && GetHost()->GetWindowTree() == this)
+    connection_manager_->WindowManagerChangeCompleted(change_id, response);
+}
+
 bool WindowTreeImpl::IsRootForAccessPolicy(const WindowId& id) const {
   return IsRoot(id);
 }
diff --git a/components/mus/ws/window_tree_impl.h b/components/mus/ws/window_tree_impl.h
index 6c22ae6..80e0476 100644
--- a/components/mus/ws/window_tree_impl.h
+++ b/components/mus/ws/window_tree_impl.h
@@ -177,6 +177,10 @@
   void PrepareForEmbed(const WindowId& window_id);
   void RemoveChildrenAsPartOfEmbed(const WindowId& window_id);
 
+  // Calls OnChangeCompleted() on the client.
+  void NotifyChangeCompleted(uint32_t change_id,
+                             mojom::WindowManagerErrorCode error_code);
+
   // WindowTree:
   void NewWindow(
       Id transport_window_id,
@@ -197,9 +201,9 @@
       Id window_id,
       const mojo::Callback<void(mojo::Array<mojom::WindowDataPtr>)>& callback)
       override;
-  void SetWindowBounds(Id window_id,
-                       mojo::RectPtr bounds,
-                       const mojo::Callback<void(bool)>& callback) override;
+  void SetWindowBounds(uint32_t change_id,
+                       Id window_id,
+                       mojo::RectPtr bounds) override;
   void SetWindowVisibility(Id window_id,
                            bool visible,
                            const mojo::Callback<void(bool)>& callback) override;
@@ -230,6 +234,7 @@
                     const SetShowStateCallback& callback) override;
   void SetResizeBehavior(uint32_t window_id,
                          mus::mojom::ResizeBehavior resize_behavior) override;
+  void WmResponse(uint32 change_id, bool response) override;
 
   // AccessPolicyDelegate:
   bool IsRootForAccessPolicy(const WindowId& id) const override;
diff --git a/components/mus/ws/window_tree_unittest.cc b/components/mus/ws/window_tree_unittest.cc
index 19cdff1..77661f9 100644
--- a/components/mus/ws/window_tree_unittest.cc
+++ b/components/mus/ws/window_tree_unittest.cc
@@ -119,6 +119,10 @@
   void OnWindowFocused(uint32_t focused_window_id) override {
     tracker_.OnWindowFocused(focused_window_id);
   }
+  void OnChangeCompleted(uint32_t change_id, bool success) override {}
+  void WmSetBounds(uint32_t change_id,
+                   Id window_id,
+                   mojo::RectPtr bounds) override {}
 
   TestChangeTracker tracker_;
 
diff --git a/components/navigation_interception/intercept_navigation_throttle.cc b/components/navigation_interception/intercept_navigation_throttle.cc
index cc256a12..ded208d61 100644
--- a/components/navigation_interception/intercept_navigation_throttle.cc
+++ b/components/navigation_interception/intercept_navigation_throttle.cc
@@ -37,7 +37,8 @@
       navigation_handle()->GetURL(), navigation_handle()->GetReferrer(),
       navigation_handle()->HasUserGesture(), navigation_handle()->IsPost(),
       navigation_handle()->GetPageTransition(), is_redirect,
-      navigation_handle()->IsExternalProtocol(), true);
+      navigation_handle()->IsExternalProtocol(),
+      navigation_handle()->IsInMainFrame());
 
   bool should_ignore_navigation = should_ignore_callback_.Run(
       navigation_handle()->GetWebContents(), navigation_params);
diff --git a/components/omnibox/browser/omnibox_view.cc b/components/omnibox/browser/omnibox_view.cc
index 7f07d5a..9a10d6b 100644
--- a/components/omnibox/browser/omnibox_view.cc
+++ b/components/omnibox/browser/omnibox_view.cc
@@ -16,6 +16,7 @@
 #include "components/toolbar/toolbar_model.h"
 #include "grit/components_scaled_resources.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/vector_icons_public.h"
 
 // static
 base::string16 OmniboxView::StripJavascriptSchemas(const base::string16& text) {
@@ -80,6 +81,24 @@
   return (id == IDR_OMNIBOX_HTTP) ? IDR_LOCATION_BAR_HTTP : id;
 }
 
+gfx::VectorIconId OmniboxView::GetVectorIcon() const {
+#if !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_IOS)
+  if (!IsEditingOrEmpty())
+    return controller_->GetToolbarModel()->GetVectorIcon();
+  // Reuse the dropdown icons...
+  gfx::VectorIconId id = AutocompleteMatch::TypeToVectorIcon(
+      model_ ? model_->CurrentTextType()
+             : AutocompleteMatchType::URL_WHAT_YOU_TYPED);
+  // but use a tweaked version for the HTTP icon.
+  return (id == gfx::VectorIconId::OMNIBOX_HTTP)
+             ? gfx::VectorIconId::LOCATION_BAR_HTTP
+             : id;
+#else
+  NOTIMPLEMENTED();
+  return gfx::VectorIconId::VECTOR_ICON_NONE;
+#endif
+}
+
 void OmniboxView::SetUserText(const base::string16& text) {
   SetUserText(text, text, true);
 }
diff --git a/components/omnibox/browser/omnibox_view.h b/components/omnibox/browser/omnibox_view.h
index 31bdb558..6095561 100644
--- a/components/omnibox/browser/omnibox_view.h
+++ b/components/omnibox/browser/omnibox_view.h
@@ -28,6 +28,10 @@
 class OmniboxViewMacTest;
 class ToolbarModel;
 
+namespace gfx {
+enum class VectorIconId;
+}
+
 class OmniboxView {
  public:
   virtual ~OmniboxView();
@@ -71,6 +75,9 @@
   // Returns the resource ID of the icon to show for the current text.
   int GetIcon() const;
 
+  // Like GetIcon(), but returns a vector icon identifier.
+  gfx::VectorIconId GetVectorIcon() const;
+
   // The user text is the text the user has manually keyed in.  When present,
   // this is shown in preference to the permanent text; hitting escape will
   // revert to the permanent text.
diff --git a/components/pairing/bluetooth_controller_pairing_controller.cc b/components/pairing/bluetooth_controller_pairing_controller.cc
index 3d8cb6a8..8f744bb 100644
--- a/components/pairing/bluetooth_controller_pairing_controller.cc
+++ b/components/pairing/bluetooth_controller_pairing_controller.cc
@@ -312,6 +312,19 @@
   }
 }
 
+void BluetoothControllerPairingController::SetHostNetwork(
+    const std::string& onc_spec) {
+  pairing_api::AddNetwork add_network;
+  add_network.set_api_version(kPairingAPIVersion);
+  add_network.mutable_parameters()->set_onc_spec(onc_spec);
+
+  int size = 0;
+  scoped_refptr<net::IOBuffer> io_buffer(
+      ProtoDecoder::SendHostNetwork(add_network, &size));
+
+  SendBuffer(io_buffer, size);
+}
+
 void BluetoothControllerPairingController::SetHostConfiguration(
     bool accepted_eula,
     const std::string& lang,
@@ -325,10 +338,13 @@
   pairing_api::ConfigureHost host_config;
   host_config.set_api_version(kPairingAPIVersion);
   host_config.mutable_parameters()->set_accepted_eula(accepted_eula);
-  host_config.mutable_parameters()->set_lang(lang);
-  host_config.mutable_parameters()->set_timezone(timezone);
+  if (!lang.empty())
+    host_config.mutable_parameters()->set_lang(lang);
+  if (!timezone.empty())
+    host_config.mutable_parameters()->set_timezone(timezone);
   host_config.mutable_parameters()->set_send_reports(send_reports);
-  host_config.mutable_parameters()->set_keyboard_layout(keyboard_layout);
+  if (!keyboard_layout.empty())
+    host_config.mutable_parameters()->set_keyboard_layout(keyboard_layout);
 
   int size = 0;
   scoped_refptr<net::IOBuffer> io_buffer(
diff --git a/components/pairing/bluetooth_controller_pairing_controller.h b/components/pairing/bluetooth_controller_pairing_controller.h
index d77f033..c987563 100644
--- a/components/pairing/bluetooth_controller_pairing_controller.h
+++ b/components/pairing/bluetooth_controller_pairing_controller.h
@@ -66,6 +66,7 @@
   void RepeatDiscovery() override;
   std::string GetConfirmationCode() override;
   void SetConfirmationCodeIsCorrect(bool correct) override;
+  void SetHostNetwork(const std::string& onc_spec) override;
   void SetHostConfiguration(bool accepted_eula,
                             const std::string& lang,
                             const std::string& timezone,
diff --git a/components/pairing/controller_pairing_controller.h b/components/pairing/controller_pairing_controller.h
index 60b17a9..59a072a 100644
--- a/components/pairing/controller_pairing_controller.h
+++ b/components/pairing/controller_pairing_controller.h
@@ -88,6 +88,9 @@
   // |STAGE_WAITING_FOR_CODE_CONFIRMATION| stage.
   virtual void SetConfirmationCodeIsCorrect(bool correct) = 0;
 
+  // Set the values that will be sent to the host to set its network.
+  virtual void SetHostNetwork(const std::string& onc_spec) = 0;
+
   // Set the values that will be sent to the host if it needs to be configured.
   virtual void SetHostConfiguration(bool accepted_eula,
                                     const std::string& lang,
diff --git a/components/pairing/fake_controller_pairing_controller.cc b/components/pairing/fake_controller_pairing_controller.cc
index ff24b9e..89a07610 100644
--- a/components/pairing/fake_controller_pairing_controller.cc
+++ b/components/pairing/fake_controller_pairing_controller.cc
@@ -204,6 +204,9 @@
     ChangeStage(STAGE_DEVICES_DISCOVERY);
 }
 
+void FakeControllerPairingController::SetHostNetwork(
+    const std::string& onc_spec) {}
+
 void FakeControllerPairingController::SetHostConfiguration(
     bool accepted_eula,
     const std::string& lang,
diff --git a/components/pairing/fake_controller_pairing_controller.h b/components/pairing/fake_controller_pairing_controller.h
index a342539..3992674 100644
--- a/components/pairing/fake_controller_pairing_controller.h
+++ b/components/pairing/fake_controller_pairing_controller.h
@@ -73,6 +73,7 @@
   void RepeatDiscovery() override;
   std::string GetConfirmationCode() override;
   void SetConfirmationCodeIsCorrect(bool correct) override;
+  void SetHostNetwork(const std::string& onc_spec) override;
   void SetHostConfiguration(bool accepted_eula,
                             const std::string& lang,
                             const std::string& timezone,
diff --git a/components/pairing/proto_decoder.cc b/components/pairing/proto_decoder.cc
index f8e42a4b..52853d3 100644
--- a/components/pairing/proto_decoder.cc
+++ b/components/pairing/proto_decoder.cc
@@ -128,19 +128,27 @@
 ProtoDecoder::IOBufferRefPtr ProtoDecoder::SendHostStatus(
     const pairing_api::HostStatus& message, int* size) {
   std::string serialized_proto;
-  if (!message.SerializeToString(&serialized_proto)) {
+  if (!message.SerializeToString(&serialized_proto))
     NOTREACHED();
-  }
 
   return SendMessage(MESSAGE_HOST_STATUS, serialized_proto, size);
 }
 
+ProtoDecoder::IOBufferRefPtr ProtoDecoder::SendHostNetwork(
+    const pairing_api::AddNetwork& message,
+    int* size) {
+  std::string serialized_proto;
+  if (!message.SerializeToString(&serialized_proto))
+    NOTREACHED();
+
+  return SendMessage(MESSAGE_ADD_NETWORK, serialized_proto, size);
+}
+
 ProtoDecoder::IOBufferRefPtr ProtoDecoder::SendConfigureHost(
     const pairing_api::ConfigureHost& message, int* size) {
   std::string serialized_proto;
-  if (!message.SerializeToString(&serialized_proto)) {
+  if (!message.SerializeToString(&serialized_proto))
     NOTREACHED();
-  }
 
   return SendMessage(MESSAGE_CONFIGURE_HOST, serialized_proto, size);
 }
@@ -148,9 +156,8 @@
 ProtoDecoder::IOBufferRefPtr ProtoDecoder::SendPairDevices(
     const pairing_api::PairDevices& message, int* size) {
   std::string serialized_proto;
-  if (!message.SerializeToString(&serialized_proto)) {
+  if (!message.SerializeToString(&serialized_proto))
     NOTREACHED();
-  }
 
   return SendMessage(MESSAGE_PAIR_DEVICES, serialized_proto, size);
 }
@@ -158,9 +165,8 @@
 ProtoDecoder::IOBufferRefPtr ProtoDecoder::SendCompleteSetup(
     const pairing_api::CompleteSetup& message, int* size) {
   std::string serialized_proto;
-  if (!message.SerializeToString(&serialized_proto)) {
+  if (!message.SerializeToString(&serialized_proto))
     NOTREACHED();
-  }
 
   return SendMessage(MESSAGE_COMPLETE_SETUP, serialized_proto, size);
 }
@@ -168,9 +174,8 @@
 ProtoDecoder::IOBufferRefPtr ProtoDecoder::SendError(
     const pairing_api::Error& message, int* size) {
   std::string serialized_proto;
-  if (!message.SerializeToString(&serialized_proto)) {
+  if (!message.SerializeToString(&serialized_proto))
     NOTREACHED();
-  }
 
   return SendMessage(MESSAGE_ERROR, serialized_proto, size);
 }
diff --git a/components/pairing/proto_decoder.h b/components/pairing/proto_decoder.h
index 826c4bb0..fc02819 100644
--- a/components/pairing/proto_decoder.h
+++ b/components/pairing/proto_decoder.h
@@ -68,6 +68,8 @@
   // Convenience functions for serializing messages into an IOBuffer.
   static IOBufferRefPtr SendHostStatus(const pairing_api::HostStatus& message,
                                        int* size);
+  static IOBufferRefPtr SendHostNetwork(const pairing_api::AddNetwork& message,
+                                        int* size);
   static IOBufferRefPtr SendConfigureHost(
       const pairing_api::ConfigureHost& message, int* size);
   static IOBufferRefPtr SendPairDevices(const pairing_api::PairDevices& message,
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 1c528c5..9f27ff0 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -63,6 +63,9 @@
 
           ይህ መመሪያ የ«DefaultSearchProviderEnabled» መመሪያ ከነቃ ብቻ ነው የሚከበረው።</translation>
 <translation id="1265053460044691532">በኤስኤኤምኤል በኩል ማረጋገጫ የተሰጠው ተጠቃሚ ከመስመር ውጭ በመለያ መግባት የሚችልበት ጊዜ ይገድቡ</translation>
+<translation id="1291880496936992484">ማስጠንቀቂያ፦ ከስሪት 52 በኋላ RC4 ሙሉ በሙሉ ከ<ph name="PRODUCT_NAME" /> ላይ ይወገዳል (ወደ ሴፕቴምብር 2016 አካባቢ) እና በመቀጠል ይህ መመሪያ መሥራቱን ያቆማል።
+
+    ይህ መመሪያ ካልተዋቀረ ወይም ወደ ሐሰት ከተዋቀረ፣ በTLS ውስጥ የስነ መሰውር ጥቅል RC4 አይነቃም። ካልሆነ ደግሞ ጊዜው ባለፈበት አገልጋይ ተኳኋኝነትን ለማግኘት እውነት ሆኖ ሊዋቀር ይችላል። ይህ ጊዜያዊ መፍትሔ ነው፣ እና አገልጋዩ ዳግም መዋቀር አለበት።</translation>
 <translation id="1297182715641689552">የ.pac ተኪ ስክሪፕት ይጠቀሙ</translation>
 <translation id="1300635491585192248">የተንቀሳቃሽ ስልክ ባልሆነ ማንኛውም አውታረ መረብ ላይ የአውታረ መረብ
           እንቅስቃሴዎችን ይገምቱ</translation>
@@ -526,6 +529,9 @@
       ይህን ቅንብር ከአነቁት ወይም ከአሰናከሉት ተጠቃሚዎች በ<ph name="PRODUCT_NAME" /> ውስጥ ያለውን የ«የማስገር እና ተንኮል-አዘል ዌር ጥበቃን አንቃ» ቅንብሩን መቀየር ወይም መሻር አይችሉም።
 
       ይህ መመሪያ እንዳልተዋቀረ ከተተወ ይሄ ይነቃል፣ ነገር ግን ተጠቃሚው ሊቀይረው ይችላል።</translation>
+<translation id="2801230735743888564">መሣሪያው ከመሥመር ውጭ በሚሆን ጊዜ ተጠቃሚዎች የዳይኖሰር ኢስተር ኤግ ጨዋታን እንዲጫወቱ ይፍቅዱ።
+
+   ይህ መመሪያ ወደ ሐሰት ከተዋቀረ፣ ተጠቃሚዎች መሣሪያው ከመሥመር ውጭ በሚሆን ጊዜ የዳይኖሰር ኢስተር ኤግ ጨዋታን መጫወት አይችሉም። ይህ ቅንብር እውነት ሆኖ ከተዋቀረ፣ ተጠቃሚች የዳይኖሰር ጨዋታን እንዲጠቀሙ ይፈቀድላቸዋል። ይህ መመሪያ ካልተዋቀረ፣ ተጠቃሚዎች በተመዘገበ Chrome OS ላይ የዳይኖሰር ኢስተር ኤግ ጨዋታን መጫወት አይችሉም፣ ሆኖም ግን በሌላ ሁኔታዎች ውስጥ መጫወት ይፈቀድላቸዋል።</translation>
 <translation id="2805707493867224476">ሁሉም ጣቢያዎች ብቅ-ባዮችን እንዲያሳዩ ፍቀድ</translation>
 <translation id="2808013382476173118">ሩቅ ደንበኞች ከዚህ ማሽን ጋር ግንኙነት ለመመስረት ሲሞክሩ የSTUN እናአገልጋዮች መጠቀምን ያነቃል።
 
@@ -1127,6 +1133,7 @@
 ይህ መመሪያ ሳይዘጋጅ ሲቀር፣ ነባሪ እርምጃው ይወሰዳል፣ እሱም ማገድ ነው።
 
 እርምጃው ከታገደ፣ <ph name="PRODUCT_OS_NAME" /> ከማገዱ በፊት የማያ ገጹን ለመቆለፍ ወይም ላለመቆለፍ በተናጠል ሊዋቀር ይችላል።</translation>
+<translation id="5130288486815037971">በTLS ውስጥ ያሉት የRC4 ስነ መሰውር ጥቅሎች እንደነቁ</translation>
 <translation id="5141670636904227950">ነባሪውን የማጉሊያ አይነት በመግቢያ ገጹ ላይ ያንቁት</translation>
 <translation id="5142301680741828703">በ<ph name="PRODUCT_FRAME_NAME" /> ውስጥ ያሉት የሚከተሉት የዩ አር ኤል ቅጦችን ሁልጊዜ አሳይ</translation>
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" /> <ph name="PRODUCT_NAME" />ን ሲያስጀምር ስራ ላይ የሚውሉ ተጨማሪ ልኬቶችን እንዲገልጹ ያስችልዎታል።
@@ -1417,6 +1424,7 @@
           ስራ ሲፈታ ማያ ገጹ እንዲቆለፍ የሚመከርበት መንገድ በማንጠልጠል ጊዜ ላይ ማያ ገጽ መቆለፍን ማንቃትና የስራ መፍታት ጊዜው ካለፈ <ph name="PRODUCT_OS_NAME" /> እንዲያንጠለጥል ማድረግ ነው። ይህ መመሪያ ስራ ላይ መዋል ያለበት ማያ ገጽ መቆለፍ ከመንጠልጠል ጉልህ ከሆነ ጊዜ በፊት መከሰት ሲኖርበት ወይም ስራ በተፈታበት ጊዜ ማንጠልጠል በጭራሽ ባልተፈለገበት ጊዜ ላይ ብቻ ነው።
 
           የመመሪያ እሴቱ በሚሊሰከንዶች ነው መጠቀስ ያለበት። የእሴቶች ድምር ከስራ ፈት መዘግየቱ ያንሳሉ።</translation>
+<translation id="6111936128861357925">የዳይኖሰር አስተር ኤግ ጨዋታን ፍቀድ</translation>
 <translation id="6114416803310251055">የተቋረጠ</translation>
 <translation id="6145799962557135888">ጃቫስክሪፕትን እንዲያሄዱ የተፈቀደላቸው ጣቢያዎችን የሚገልጹ የዩ አር ኤልዎች ቅጦችን እንዲዘረዝሩ ያስችልዎታል።
 
@@ -2052,6 +2060,8 @@
 
       ይህ መመሪያ ካልተዋቀረ በ«URLBlacklist» የተከለከሉ ዝርዝር ውስጥ ምንም የማይካተቱ አይኖሩም።</translation>
 <translation id="8176035528522326671">የድርጅት ተጠቃሚ ዋናው ባለብዙ መገለጫ ተጠቃሚ እንዲሆን ይፈቀድለት (በድርጅት ለሚቀናበሩ ተጠቃሚዎች ነባሪ ባህሪ)</translation>
+<translation id="8191318459035150777">በ<ph name="PRODUCT_NAME" /> ውስጥ ያለውን ነባሪ የመነሻ ገፅ URL ያዋቅራል እና ተጠቃሚዎች እንዳይለውጡት ይከላከላል። የመነሻ ገፅ በመነሻ አዝራር መመሪያዎች የተከፈተ ገፅ ነው። በመጀመሪያ የሚከፈቱ ገጾች በRestoreOnStartup መመሪያዎች ቁጥጥር ይደረግባቸዋል። የመነሻ ገፅ አይነት አንድም እርስዎ እዚህ እንደጠቀሱት URL ሊዋቀር ይችላል ወይም በአዲስ ትር ገፅ ላይ ይዋቀራል። አዲስ የትር ገፅ ከመረጡ፣ ይህ መመሪያ በሥራ ላይ አይውልም። 
+ይህንን ቅንብር ካነቁ፣ ተጠቃሚዎች የመነሻ ገጻቸውን URL በ<ph name="PRODUCT_NAME" /> ውስጥ አይለውጡም፣ ሆኖም ግን አሁንም የአዲስ ትርን ገፅ እንደ መነሻ ገፃቸው መምረጥ ይችላሉ። ይህንን መመሪያ ሳያዋቅሩ መተው እንዲሁም በመነሻገፅአዲስትርገፅነውን አለማዋቀር ተጠቃሚው የራሱን መነሻ ገፅ ለመምረጥ ያስችለዋል። ይህ መመሪያ ንቁ የማውጫ ጎራን ባልተቀላቀሉ የWindows ምሳሌዎች ላይ አይገኝም።</translation>
 <translation id="8197918588508433925">ይህ መመሪያ ለርቀት ማስረገጥ የድርጅት መሣሪያ ስርዓት ቁልፎች ኤ ፒ አዩን chrome.enterprise.platformKeysPrivate.challengeUserKey() እንዲጠቀሙ የተፈቀደላቸው ቅጥያዎችን ይገልጻል። ቅጥያዎች ኤ ፒ አዩን ለመጠቀም ወደዚህ ዝርዝር መታከል አለባቸው።
 
           አንድ ቅጥያ በዝርዝሩ ውስጥ ከሌለ ወይም ደግሞ ዝርዝሩ ካልተዋቀረ ወደ ኤ ፒ አዩ የሚደረግ ጥሪ ከስህተት ኮድ ጋር አይሳካም።</translation>
@@ -2167,6 +2177,7 @@
           ይህን ቅንብር ካነቁ CNAME ፍለጋ ይዘለልና የአገልጋዩ ስም እንደገባው ያገለግላል።
 
           ይህን ቅንብር ካሰናከሉ ወይም እንዳልተዋቀረ ከተዉት የአገልጋዩ canonical ስም በCNAME ፍለጋ በኩል ይታወቃል።</translation>
+<translation id="8774131509736383471">ይህ መመሪያ ወደ እውነት ከተዋቀረ<ph name="PRODUCT_NAME" />ያለምንም ቅድመ ሁኔታ በመጀመሪያው አሂድ ውስጥ የሚታየውን የመጀመሪያውን መስኮት ያሳድጋል።    ይህ መመሪያ ሐሰት ከተዋቀረ ወይም ካልተዋቀረ፣ በማያ ገፅ መጠኑ ላይ ተመስርቶ የሚታየውን የመጀመሪያ መስኮቱ ያሳድግ እንደሆነ ውሳኔ ይሰጣል።</translation>
 <translation id="8777120694819070607"><ph name="PRODUCT_NAME" /> ጊዜ ያለፈባቸው ተሰኪዎች እንዲያሂድ ይፈቅዳል።
 
       ይህን ቅንብር ካነቁ ጊዜ ያለፈባቸው ተሰኪዎች እንደመደበኛ ተሰኪዎች ስራ ላይ ይውላሉ።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index 4f5274e..06e4634 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -54,6 +54,9 @@
 <translation id="1221359380862872747">‏تحميل عناوين URL محددة عند تسجيل الدخول إلى الوضع التجريبي</translation>
 <translation id="1240643596769627465">‏لتحديد عنوان URL لمحرك البحث المستخدَم لتوفير نتائج فورية. يجب أن يشتمل عنوان URL على السلسلة <ph name="SEARCH_TERM_MARKER" />، والتي سيتم استبدالها عند طلب البحث بالنص الذي أدخله المستخدم حتى الآن. هذه السياسة اختيارية. إذا لم يتم تعيينها، فلن يتم تقديم أية نتائج بحث فوري. لا يتم الالتزام بهذه السياسة إلا إذا تم تمكين السياسة 'DefaultSearchProviderEnabled'.</translation>
 <translation id="1265053460044691532">‏يمكن تقييد الوقت الذي يستطيع مستخدم تمت مصادقته عبر SAML خلاله تسجيل دخوله في وضع عدم الاتصال</translation>
+<translation id="1291880496936992484">‏تحذير: ستتم إزالة RC4 تمامًا من <ph name="PRODUCT_NAME" /> بعد إصدار 52 (حول أيلول (سبتمبر) 2016) وستتوقف هذه السياسة عن العمل حينئذٍ.
+
+      إذا لم يتم تعيين السياسة أو تم تعيين السياسة على "false"، فحينئذٍ لن يتم تمكين مجموعات تشفير RC4 في طبقة النقل الآمنة. وإلا قد يتم تعيينها على "true" للحفاظ على التوافق مع الخادم القديم. ويُعد هذا إجراءً مؤقتًا ومن المفترض أن تتم إعادة تهيئة الخادم.</translation>
 <translation id="1297182715641689552">‏استخدام نص برمجي لملف pac. للخادم الوكيل</translation>
 <translation id="1300635491585192248">توقع إجراءات الشبكة على أي شبكة ليست
           شبكة خلوية</translation>
@@ -472,6 +475,9 @@
       وإذا مكّنت هذا الإعداد أو عطّلته، فلن يتمكن المستخدمون من تغيير الإعداد "تمكين الحماية من تصيّد المعلومات والبرمجيّات الخبيثة" أو تجاوزه في <ph name="PRODUCT_NAME" />.
 
       في حالة ترك هذه السياسة بدون تعيين، فسيتم تمكينها غير أن المستخدم سيتمكن من تغييرها.</translation>
+<translation id="2801230735743888564">‏السماح للمستخدمين بتشغيل لعبة Dinosaur Easter Egg عندما يكون الجهاز بلا اتصال.
+
+      إذا تم تعيين هذه السياسة على "False"، فلن يتمكن المستخدمون من تشغيل لعبة Dinosaur Easter Egg عندما يكون الجهاز بلا اتصال. وإذا تم تعيين هذا الإعداد على "True"، فسيتم السماح للمستخدمين بتشغيل لعبة Dinosaur. وإذا لم يتم تعيين هذه السياسة، فلن يتم السماح للمستخدمين بتشغيل لعبة Dinosaur Easter Egg في نظام تشغيل Chrome المُسجل، ولكن يتم السماح لهم بتشغيل هذه اللعبة في ظل ظروف أخرى.</translation>
 <translation id="2805707493867224476">السماح لجميع المواقع بعرض النوافذ المنبثقة</translation>
 <translation id="2808013382476173118">‏لتمكين استخدام خوادم STUN عند محاولة العملاء البعيدين إنشاء اتصال بهذا الجهاز.
 
@@ -1003,6 +1009,7 @@
           وعند إلغاء تحديده، يتم اتخاذ الإجراء الافتراضي وهو التعليق.
 
           وإذا كان الإجراء هو التعليق، فيمكن تهيئة <ph name="PRODUCT_OS_NAME" /> بشكل منفصل على قفل الشاشة أو عدم قفلها قبل التعليق.</translation>
+<translation id="5130288486815037971">‏ما إذا تم تمكين مجموعات تشفير RC4 في طبقة النقل الآمنة أم لا</translation>
 <translation id="5141670636904227950">تعيين نوع مكبر الشاشة الافتراضي على تمكين في شاشة تسجيل الدخول</translation>
 <translation id="5142301680741828703">‏عرض أنماط عناوين URL التالية دائمًا في <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">تسمح لك بتحديد معلمات إضافية يتم استخدامها عند بدء <ph name="PRODUCT_FRAME_NAME" /> تشغيل <ph name="PRODUCT_NAME" />.
@@ -1244,6 +1251,7 @@
 
       إذا تم تعطيل هذا الإعداد أو لم تتم تهيئته، يمكن للمستخدمين استخدام جميع أنواع وحدات التخزين الخارجية المتوافقة على أجهزتهم.</translation>
 <translation id="6095999036251797924">لتحديد طول مدة توقف نشاط الإدخال لدى المستخدم التي يتم بعدها قفل الشاشة عند التشغيل على تيار متردد أو على البطارية. وعند تعيين المدة على قيمة أكبر من صفر، فذلك يمثل طول المدة التي يجب أن ينتظرها المستخدم في وضع بعيد حتى يتم قفل شاشة جهاز <ph name="PRODUCT_OS_NAME" />. وعند تعيين المدة على صفر، لن يتم قفل شاشة جهاز <ph name="PRODUCT_OS_NAME" /> عندما يتحول المستخدم إلى وضع بعيد. وعند ترك المدة بدون تعيين، يتم استخدام مدة افتراضية. والطريقة التي يوصى باتباعها لقفل الشاشة عند دخول المستخدم في وضع بعيد هي تمكين قفل الشاشة على التعليق وطلب تعليق <ph name="PRODUCT_OS_NAME" /> بعد تأخر الدخول في وضع بعيد. يجب عدم استخدام هذه السياسة إلا عندما يتعين ظهور قفل الشاشة لمدة أطول من التعليق أو عند عدم الرغبة تمامًا في التعليق عند الدخول في وضع بعيد. يجب تحديد قيمة السياسة باستخدام الميللي ثانية. ويتم تثبيت القيم بحيث تكون أقل من تأخر الدخول في وضع بعيد.</translation>
+<translation id="6111936128861357925">‏السماح بلعبة Dinosaur Easter Egg</translation>
 <translation id="6114416803310251055">تم تجاهله</translation>
 <translation id="6145799962557135888">‏للسماح لك بتعيين قائمة أنماط عناوين URL التي تحدد المواقع التي يُسمح لها بتشغيل جافا سكريبت. إذا تم ترك هذه السياسة بدون تعيين، فسيتم استخدام القيمة الافتراضية العامة لجميع المواقع إما من السياسة 'DefaultJavaScriptSetting' إذا كان قد تم تعيينها أو من التهيئة الشخصية للمستخدم.</translation>
 <translation id="6151775819333710697">
@@ -1789,6 +1797,18 @@
 
       في حالة ترك هذه السياسة بدون تعيين، لن يكون هناك أي استثناءات لقائمة العناوين المحظورة من سياسة 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">السماح لمستخدم المؤسسة بأن يكون مستخدمًا أساسيًا لملفات شخصية متعددة (السلوك الافتراضي للمستخدمين تحت إدارة المؤسسات)</translation>
+<translation id="8191318459035150777">‏لتهيئة عنوان URL للصفحة الرئيسية الافتراضية في <ph name="PRODUCT_NAME" /> ومنع المستخدمين من تغييره.
+
+          الصفحة الرئيسية هي الصفحة التي يتم فتحها باستخدام زر "الصفحة الرئيسية". ويتم التحكم في الصفحات المفتوحة عند بدء التشغيل من خلال سياسات RestoreOnStartup.
+
+          يمكن تعيين نوع الصفحة الرئيسية إما على عنوان URL تحدده هنا، أو على صفحة علامة تبويب جديدة. وفي حالة تحديد "صفحة علامة تبويب جديدة"، لن تصبح هذه السياسة سارية حينئذٍ.
+
+          وفي حالة تمكين هذا الإعداد، لن يتمكن المستخدمون من تغيير عنوان URL للصفحة الرئيسية في <ph name="PRODUCT_NAME" />، ولكن يظل بإمكانهم اختيار صفحة علامة التبويب الجديدة، كصفحة رئيسية.
+
+          وسيؤدي ترك هذه السياسة بدون تعيين إلى السماح للمستخدم باختيار الصفحة الرئيسية لديه، إذا لم يتم تعيين السياسة HomepageIsNewTabPage أيضًا.
+
+          لا تتوفر هذه السياسة في النسخ الافتراضية لنظام التشغيل Windows غير الملحقة
+          بنطاق Active Directory.</translation>
 <translation id="8197918588508433925">‏تحدد هذه السياسة الإضافات المسموح لها باستخدام واجهة برمجة تطبيقات مفاتيح النظام الأساسي للمؤسسة chrome.enterprise.platformKeysPrivate.challengeUserKey() للتأكيد عن بُعد. يجب إدراج هذه الإضافات في هذه القائمة لاستخدام واجهة برمجة التطبيقات.
 
           في حالة عدم توفر إضافة في القائمة، أو عدم تعيين القائمة، سيخفق الاتصال بواجهة برمجة التطبيقات مع ظهور رمز خطأ.</translation>
@@ -1887,6 +1907,8 @@
 
       في حالة تعطيل هذا الإعداد، لا يمكن حذف سجل التصفح أو التنزيل.</translation>
 <translation id="8764119899999036911">‏لتحديد ما إذا كان اسم الخدمة الأساسي، الذي تم إنشاؤه لـ Kerberos، يستند إلى الاسم المتعارف عليه لنظام أسماء النطاقات أو إلى الاسم الأصلي الذي تم إدخاله. إذا تم تمكين هذا الإعداد، فسيتم تخطي بحث CNAME وسيتم استخدام اسم الخادم كما تم إدخاله. إذا تم تعطيل هذا الإعداد، فسيتم تحديد الاسم المتعارف عليه للخادم عبر بحث CNAME.</translation>
+<translation id="8774131509736383471">‏إذا تم تعيين هذه السياسة على "true"، فسيزيد <ph name="PRODUCT_NAME" /> حجم النافذة الأولى المعروضة بدون شرط عند التشغيل الأول.
+      إذا تم تعيين هذه السياسة على "false" أو لم يتم تهيئتها، فسيعتمد قرار زيادة حجم النافذة الأولى المعروضة على حجم الشاشة.</translation>
 <translation id="8777120694819070607">للسماح لـ <ph name="PRODUCT_NAME" /> بتشغيل المكونات الإضافية القديمة.
 
       إذا مكّنت هذا الإعداد، يتم استخدام المكونات الإضافية القديمة كمكونات إضافية عادية.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index cdd7d3ee..9ed4cae1 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -615,7 +615,7 @@
 <translation id="3067188277482006117">Pokud má hodnotu true, uživatel může pomocí hardwaru, který je součástí zařízení Chrome, vzdáleně sdělit svou identitu funkci Privacy CA prostřednictvím rozhraní Enterprise Platform Keys API chrome.enterprise.platformKeysPrivate.challengeUserKey().
 
           Pokud má tato zásada hodnotu false nebo není nastavena, volání rozhraní API se nezdaří a zobrazí se kód chyby.</translation>
-<translation id="3069958900488014740">Umožňuje vypnout ve službě <ph name="PRODUCT_NAME" /> optimalizaci WPAD (Web Proxy Auto-Discovery).
+<translation id="3069958900488014740">Umožňuje vypnout v prohlížeči <ph name="PRODUCT_NAME" /> optimalizaci WPAD (Web Proxy Auto-Discovery).
 
       Je-li tato zásada nastavena na hodnotu false, je optimalizace WPAD zakázána, a <ph name="PRODUCT_NAME" /> proto bude na servery WPAD založené na DNS čekat déle. Pokud tato zásada není nastavena, je optimalizace WPAD povolena.
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index 36316fb5..0aad171 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -64,6 +64,9 @@
 
           Αυτή η πολιτική τηρείται μόνο αν η πολιτική ''DefaultSearchProviderEnabled'' είναι ενεργοποιημένη.</translation>
 <translation id="1265053460044691532">Περιορίστε το χρονικό διάστημα για το οποίο ένας χρήστης που έχει πραγματοποιήσει έλεγχο ταυτότητας μέσω SAML μπορεί να συνδεθεί εκτός σύνδεσης</translation>
+<translation id="1291880496936992484">Προειδοποίηση: Το RC4 θα καταργηθεί εντελώς από το <ph name="PRODUCT_NAME" /> μετά την έκδοση 52 (περίπου τον Σεπτέμβριο του 2016) και αυτή η πολιτική θα σταματήσει τότε να λειτουργεί.
+
+      Αν η πολιτική δεν έχει οριστεί ή οριστεί σε false, οι σουίτες κρυπτογράφησης RC4 στο TLS δεν θα ενεργοποιηθούν. Εναλλακτικά, μπορεί να οριστεί σε true για τη διατήρηση της συμβατότητας με έναν μη ενημερωμένο διακομιστή. Αυτό αποτελεί μια πρόχειρη λύση και ο διακομιστής θα πρέπει να διαμορφωθεί ξανά.</translation>
 <translation id="1297182715641689552">Χρησιμοποιήστε ένα σενάριο διακομιστή μεσολάβησης .pac</translation>
 <translation id="1300635491585192248">Πρόβλεψη ενεργειών δικτύου σε οποιοδήποτε δίκτυο δεν είναι δίκτυο
           κινητής τηλεφωνίας</translation>
@@ -524,6 +527,9 @@
       Αν ενεργοποιήσετε ή απενεργοποιήσετε αυτήν τη ρύθμιση, οι χρήστες δεν μπορούν να αλλάζουν ή να παρακάμπτουν τη ρύθμιση "Ενεργοποίηση προστασίας από ηλεκτρονικό "ψάρεμα" και κακόβουλα προγράμματα" στο <ph name="PRODUCT_NAME" />.
 
       Αν δεν ρυθμιστεί αυτή η πολιτική, η λειτουργία θα ενεργοποιηθεί, αλλά ο χρήστης δεν θα μπορεί να την αλλάξει.</translation>
+<translation id="2801230735743888564">Επιτρέπει στους χρήστες να παίξουν το κρυφό παιχνίδι με τον δεινόσαυρο όταν η συσκευή είναι εκτός σύνδεσης.
+
+      Αν η πολιτική έχει οριστεί σε False, οι χρήστες δεν θα μπορούν να παίξουν το κρυφό παιχνίδι με τον δεινόσαυρο όταν η συσκευή είναι εκτός σύνδεσης. Αν αυτή η ρύθμιση οριστεί σε True, οι χρήστες θα μπορούν να παίξουν το παιχνίδι με τον δεινόσαυρο. Αν δεν οριστεί αυτή η πολιτική, οι χρήστες δεν επιτρέπεται να παίξουν το κρυφό παιχνίδι με τον δεινόσαυρο σε εγγεγραμμένο Chrome OS, αλλά έχουν τη δυνατότητα να παίξουν υπό διαφορετικές συνθήκες.</translation>
 <translation id="2805707493867224476">Να επιτρέπεται σε όλους τους ιστότοπους η εμφάνιση αναδυόμενων παραθύρων</translation>
 <translation id="2808013382476173118">Ενεργοποιεί τη χρήση διακομιστών STUN όταν απομακρυσμένοι πελάτες προσπαθούν να δημιουργήσουν μια σύνδεση με αυτόν τον υπολογιστή.
 
@@ -1114,6 +1120,7 @@
           Εάν δεν έχει οριστεί αυτή η πολιτική, εφαρμόζεται η προεπιλεγμένη ενέργεια, η οποία είναι η αναστολή.
 
           Εάν η ενέργεια είναι αναστολή, το <ph name="PRODUCT_OS_NAME" /> μπορεί να διαμορφωθεί ξεχωριστά είτε έτσι ώστε να κλειδώνει είτε να ξεκλειδώνει την οθόνη πριν από την αναστολή.</translation>
+<translation id="5130288486815037971">Εάν έχουν ενεργοποιηθεί οι σουίτες κρυπτογράφησης RC4 στο TLS</translation>
 <translation id="5141670636904227950">Ορίστε τον προεπιλεγμένο τύπο μεγέθυνσης οθόνης που θα ενεργοποιηθεί στην οθόνη σύνδεσης</translation>
 <translation id="5142301680741828703">Να εμφανίζονται πάντα τα παρακάτω πρότυπα διεύθυνσης URL στο <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Σας επιτρέπει να καθορίσετε πρόσθετες παραμέτρους που χρησιμοποιούνται όταν το <ph name="PRODUCT_FRAME_NAME" /> πραγματοποιεί εκκίνηση του <ph name="PRODUCT_NAME" />.
@@ -1400,6 +1407,7 @@
           Ο προτεινόμενος τρόπος κλειδώματος της οθόνης κατά τη λειτουργία αδράνειας είναι η ενεργοποίηση του κλειδώματος οθόνης κατά την αναστολή και ο ορισμός της αναστολής του <ph name="PRODUCT_OS_NAME" /> μετά την καθυστέρηση αδράνειας. Αυτή η πολιτική θα πρέπει να χρησιμοποιείται μόνο όταν πρέπει να εμφανιστεί η οθόνη κλειδώματος, σημαντικό χρονικό διάστημα πριν από την αναστολή ή όταν η αναστολή κατά τη λειτουργία αδράνειας δεν είναι επιθυμητή.
 
           Οι τιμές της πολιτικής θα πρέπει να οριστούν σε χιλιοστά του δευτερολέπτου. Οι τιμές συμπιέζονται έτσι ώστε να είναι μικρότερες από την καθυστέρηση αδράνειας.</translation>
+<translation id="6111936128861357925">Να επιτρέπεται το κρυφό παιχνίδι με τον δεινόσαυρο</translation>
 <translation id="6114416803310251055">έχει αποσυρθεί</translation>
 <translation id="6145799962557135888">Σας επιτρέπει να ορίσετε μια λίστα με τα μοτίβα διευθύνσεων url που προσδιορίζουν τους ιστότοπους στους οποίους επιτρέπεται η εκτέλεση JavaScript.
 
@@ -2029,6 +2037,18 @@
 
       Αν αυτή η πολιτική δεν οριστεί, δεν θα υπάρχουν εξαιρέσεις στη λίστα αποκλεισμένων από την πολιτική "URLBlacklist".</translation>
 <translation id="8176035528522326671">Να επιτρέπεται στον εταιρικό χρήστη να είναι τόσο κύριος όσο και δευτερεύων (προεπιλεγμένη συμπεριφορά για εταιρικούς, διαχειριζόμενους χρήστες)</translation>
+<translation id="8191318459035150777">Διαμορφώνει το URL της προεπιλεγμένης αρχικής σελίδας στο <ph name="PRODUCT_NAME" /> και αποτρέπει την αλλαγή του από τους χρήστες.
+
+          Η αρχική σελίδα είναι η σελίδα που ανοίγει μέσω του κουμπιού Αρχικής σελίδας. Οι σελίδες που ανοίγουν κατά την εκκίνηση ελέγχονται από τις πολιτικές RestoreOnStartup.
+
+          Ο τύπος αρχικής σελίδας μπορεί να οριστεί σε ένα URL που θα καθορίσετε εδώ ή στη σελίδα σε νέα καρτέλα. Αν επιλέξετε τη σελίδα σε νέα καρτέλα, αυτή η πολιτική δεν ενεργοποιείται.
+
+          Αν ενεργοποιήσετε αυτήν τη ρύθμιση, οι χρήστες δεν θα μπορούν να αλλάξουν το URL της αρχικής σελίδας τους στο <ph name="PRODUCT_NAME" />, αλλά θα έχουν ακόμη τη δυνατότητα να επιλέξουν τη σελίδα σε νέα καρτέλα ως την αρχική σελίδα τους.
+
+          Ο μη ορισμός αυτής της πολιτικής θα επιτρέψει στο χρήστη να επιλέξει ο ίδιος την αρχική σελίδα του εάν το HomepageIsNewTabPage δεν έχει οριστεί.
+
+          Αυτή η πολιτική δεν είναι διαθέσιμη σε στιγμιότυπα Windows που δεν συμμετέχουν
+          σε έναν τομέα του Active Directory.</translation>
 <translation id="8197918588508433925">Η παρούσα πολιτική καθορίζει τις επιτρεπόμενες επεκτάσεις για τη χρήση του API Enterprise Platform Keys chrome.enterprise.platformKeysPrivate.challengeUserKey() για απομακρυσμένη διαβεβαίωση. Για τη χρήση του API, οι επεκτάσεις θα πρέπει να προστίθενται σε αυτήν τη λίστα.
 
           Εάν μια επέκταση δεν περιλαμβάνεται στη λίστα, ή εάν δεν έχει οριστεί η λίστα, η κλήση προς το API θα αποτυγχάνει εμφανίζοντας έναν κωδικό σφάλματος.</translation>
@@ -2145,6 +2165,8 @@
           Αν ενεργοποιήσετε αυτήν τη ρύθμιση, η αναζήτηση CNAME θα παραλειφθεί και το όνομα του διακομιστή θα χρησιμοποιηθεί όπως έχει καταχωριστεί.
 
           Αν απενεργοποιήσετε αυτήν τη ρύθμιση ή δεν την ορίσετε, το κανονικό όνομα του διακομιστή θα καθοριστεί μέσω της αναζήτησης CNAME.</translation>
+<translation id="8774131509736383471">Εάν αυτή η πολιτική έχει οριστεί σε true, το <ph name="PRODUCT_NAME" /> θα μεγιστοποιήσει άνευ όρων το πρώτο παράθυρο που εμφανίζεται κατά την πρώτη εκτέλεση.
+      Εάν αυτή η πολιτική οριστεί σε false ή δεν διαμορφωθεί, η απόφαση σχετικά με τη μεγιστοποίηση του πρώτου εμφανιζόμενου παραθύρου θα βασίζεται στο μέγεθος της οθόνης.</translation>
 <translation id="8777120694819070607">Επιτρέπει στο <ph name="PRODUCT_NAME" /> την εκτέλεση προσθηκών οι οποίες είναι παλιές. Αν ενεργοποιήσετε αυτήν τη ρύθμιση, οι παλιές προσθήκες θα χρησιμοποιούνται σαν κανονικές προσθήκες. Αν απενεργοποιήσετε αυτήν τη ρύθμιση, οι παλιές προσθήκες δεν θα χρησιμοποιούνται και δεν θα ζητείται άδεια από τους χρήστες για να τις εκτελέσουν. Αν δεν έχει γίνει καθορισμός αυτής της ρύθμισης, θα ζητείται άδεια από τους χρήστες για την εκτέλεση παλιών προσθηκών.</translation>
 <translation id="87812015706645271">Απαιτεί να υπάρχει συμφωνία ανάμεσα στο όνομα του τοπικού χρήστη και του κατόχου κεντρικού υπολογιστή απομακρυσμένης πρόσβασης</translation>
 <translation id="8782750230688364867">Προσδιορίζει το ποσοστό κατά το οποίο προσαρμόζεται η καθυστέρηση μείωσης της φωτεινότητας της οθόνης όταν η συσκευή βρίσκεται σε λειτουργία παρουσίασης.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 47e4a46..325ba9d 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -64,6 +64,9 @@
 
           This policy is only respected if the 'DefaultSearchProviderEnabled' policy is enabled.</translation>
 <translation id="1265053460044691532">Limit the time for which a user authenticated via SAML can log in offline</translation>
+<translation id="1291880496936992484">Warning: RC4 will be completely removed from <ph name="PRODUCT_NAME" /> after version 52 (around September 2016) and this policy will stop working then.
+
+      If the policy is not set, or is set to false, then RC4 cipher suites in TLS will not be enabled. Otherwise it may be set to true to retain compatibility with an outdated server. This is a stopgap measure and the server should be reconfigured.</translation>
 <translation id="1297182715641689552">Use a .pac proxy script</translation>
 <translation id="1300635491585192248">Predict network actions on any network that is not cellular</translation>
 <translation id="1304973015437969093">Extension/App IDs and update URLs to be silently installed</translation>
@@ -525,6 +528,9 @@
       If you enable or disable this setting, users cannot change or override the "Enable phishing and malware protection" setting in <ph name="PRODUCT_NAME" />.
 
       If this policy is left not set, this will be enabled but the user will be able to change it.</translation>
+<translation id="2801230735743888564">Allow users to play dinosaur easter egg game when device is offline.
+
+      If this policy is set to False, users will not be able to play the dinosaur Easter egg game when device is offline. If this setting is set to True, users are allowed to play the dinosaur game. If this policy is not set, users are not allowed to play the dinosaur Easter egg game on enrolled Chrome OS, but are allowed to play it under other circumstances.</translation>
 <translation id="2805707493867224476">Allow all sites to show pop-ups</translation>
 <translation id="2808013382476173118">Enables usage of STUN servers when remote clients are trying to establish a connection to this machine.
 
@@ -1134,6 +1140,7 @@
           When this policy is unset, the default action is taken, which is suspend.
 
           If the action is suspend, <ph name="PRODUCT_OS_NAME" /> can separately be configured to either lock or not lock the screen before suspending.</translation>
+<translation id="5130288486815037971">Whether RC4 cipher suites in TLS are enabled</translation>
 <translation id="5141670636904227950">Set the default screen magnifier type enabled on the login screen</translation>
 <translation id="5142301680741828703">Always render the following URL patterns in <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Allows you to specify additional parameters that are used when <ph name="PRODUCT_FRAME_NAME" /> launches <ph name="PRODUCT_NAME" />.
@@ -1426,6 +1433,7 @@
           The recommended way to lock the screen on idle is to enable screen locking on suspend and have <ph name="PRODUCT_OS_NAME" /> suspend after the idle delay. This policy should only be used when screen locking should occur a significant amount of time sooner than suspend or when suspend on idle is not desired at all.
 
           The policy value should be specified in milliseconds. Values are clamped to be less than the idle delay.</translation>
+<translation id="6111936128861357925">Allow Dinosaur Easter Egg Game</translation>
 <translation id="6114416803310251055">deprecated</translation>
 <translation id="6145799962557135888">Allows you to set a list of url patterns that specify sites which are allowed to run JavaScript.
 
@@ -2059,6 +2067,18 @@
 
       If this policy is not set there will be no exceptions to the blacklist from the 'URLBlacklist' policy.</translation>
 <translation id="8176035528522326671">Allow enterprise user to be primary multi-profile user only (Default behaviour for enterprise-managed users)</translation>
+<translation id="8191318459035150777">Configures the default homepage URL in <ph name="PRODUCT_NAME" /> and prevents users from changing it.
+
+          The homepage is the page opened by the Home button. The pages that open on start-up are controlled by the RestoreOnStartup policies.
+
+          The homepage type can either be set to a URL you specify here or set to the New Tab Page. If you select the New Tab Page, then this policy does not take effect.
+
+          If you enable this setting, users cannot change their homepage URL in <ph name="PRODUCT_NAME" />, but they can still choose the New Tab Page as their home page.
+
+          If this policy is not set, this will allow the user to choose their home page if HomepageIsNewTabPage is not set.
+
+          This policy is not available on Windows instances that are not joined
+          to an Active Directory domain.</translation>
 <translation id="8197918588508433925">This policy specifies the allowed extensions to use Enterprise Platform Keys API chrome.enterprise.platformKeysPrivate.challengeUserKey() for remote attestation. Extensions must be added to this list to use the API.
 
           If an extension is not in the list, or the list is not set, the call to the API will fail with an error code.</translation>
@@ -2175,6 +2195,8 @@
           If you enable this setting, CNAME lookup will be skipped and the server name will be used as entered.
 
           If you disable this setting or leave it unset, the canonical name of the server will be determined via CNAME lookup.</translation>
+<translation id="8774131509736383471">If this policy is set to true, <ph name="PRODUCT_NAME" /> will unconditionally maximise the the first window shown on first run.
+      If this policy is set to false or not configured, the decision whether to maximise the first window shown will be based on the screen size.</translation>
 <translation id="8777120694819070607">Allows <ph name="PRODUCT_NAME" />.</translation>
 <translation id="87812015706645271">Requires that the name of the local user and the remote access host owner match</translation>
 <translation id="8782750230688364867">Specifies the percentage by which the screen dim delay is scaled when the device is in presentation mode.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 873c66e..a5da060 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -64,6 +64,9 @@
 
           Kinikilala lamang ang patakarang ito kung pinagana ang patakaran ng 'DefaultSearchProviderEnabled.'</translation>
 <translation id="1265053460044691532">Limitahan ang oras na maaaring mag-log in offline ang isang user na na-authenticate gamit ang SAML</translation>
+<translation id="1291880496936992484">Babala: Tuluyan nang maalis ang RC4 sa <ph name="PRODUCT_NAME" /> pagkatapos ng bersyon 52 (tinatayang lalabas sa Setyembre 2016) at hindi na gagana ang patakarang ito.
+
+      Kung hindi itatakda ang patakaran, o kung itatakda ito sa false, hindi mae-enable ang mga RC4 na cipher suite sa TLS. Maaari itong itakda sa true upang manatili itong compatible sa isang lumang server. Isa lang itong pansamantalang solusyon at dapat pa ring i-configure ang server.</translation>
 <translation id="1297182715641689552">Gumamit ng .pac proxy script</translation>
 <translation id="1300635491585192248">Hulaan ang mga pagkilos sa network sa anumang network na hindi
           cellular</translation>
@@ -525,6 +528,9 @@
       Kung iyong i-enable o i-disable ang setting na ito, hindi maaaring baguhin o i-override ng mga user ang setting na "I-enable ang proteksyon sa phishing at malware" sa <ph name="PRODUCT_NAME" />.
 
       Kung iiwanang hindi nakatakda ang patakarang ito, ma-e-enable ito, ngunit mababago ito ng user.</translation>
+<translation id="2801230735743888564">Nagbibigay-daan sa mga user na makapaglaro ng dinosaur easter egg game kapag offline ang device.
+
+      Kung itatakda sa False ang patakarang ito, kapag naka-offline ang device, hindi makakapaglaro ng dinosaur easter egg game ang mga user. Kung itatakda naman sa True ang setting na ito, makakapaglaro ng dinosaur game ang mga user. Kung hindi itatakda ang patakarang ito, hindi makakapaglaro ng dinosaur easter egg game ang mga user na naka-enroll sa Chrome OS, ngunit sa ibang mga pagkakataon, maaari itong malaro ng mga user.</translation>
 <translation id="2805707493867224476">Payagang magpakita ng mga pop-up ang lahat ng site</translation>
 <translation id="2808013382476173118">Ini-enable ang paggamit ng mga STUN server kapag sinusubukan ng mga malayuang kliyente na magtatag ng koneksyon sa makinang ito.
 
@@ -1132,6 +1138,7 @@
           Kapag hindi nakatakda ang patakarang ito, ginagawa ang default na pagkilos, na suspendihin.
 
           Kung ang pagkilos ay suspendihin, mako-configure nang hiwalay ang <ph name="PRODUCT_OS_NAME" /> upang i-lock o hindi i-lock ang screen bago ang pagsususpinde.</translation>
+<translation id="5130288486815037971">Kung naka-enable ang mga RC4 na cipher suite sa TLS o hindi</translation>
 <translation id="5141670636904227950">Itakda ang default na uri ng magnifier ng screen na naka-enable sa screen sa pag-login</translation>
 <translation id="5142301680741828703">Palaging i-render ang mga sumusunod na pattern ng URL sa <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Binibigyang-daan kang tukuyin ang mga karagdagang parameter na ginagamit kapag nilunsad ng <ph name="PRODUCT_FRAME_NAME" /> ang <ph name="PRODUCT_NAME" />.
@@ -1418,6 +1425,7 @@
           Ang inirerekomendang paraan ng pag-lock ng screen sa idle ay ang i-enable ang pagla-lock ng screen habang naka-suspend at hayaang mag-suspend ang <ph name="PRODUCT_OS_NAME" /> pagkatapos ang itinakdang oras ng pagiging idle. Dapat lang gamitin ang patakarang ito kapag magaganap ang pagla-lock ng screen sa loob ng mas maikling panahon kaysa sa suspend o kapag hindi mo gustong mangyari ang pag-suspend habang naka-idle.
 
           Dapat tukuyin ang value ng patakaran sa milliseconds. Itinatakda ang mga value upang maging mas maikli ang mga ito kaysa sa itinakdang oras ng pagiging idle.</translation>
+<translation id="6111936128861357925">Pahintulutan ang Dinosaur Easter Egg Game</translation>
 <translation id="6114416803310251055">hindi na ginagamit</translation>
 <translation id="6145799962557135888">Binibigyang-daan kang magtakda ng isang listahan ng mga pattern ng url na tumutukoy ng mga site na pinapayagang magpatakbo ng JavaScript.
 
@@ -2048,6 +2056,18 @@
 
       Kung hindi nakatakda ang patakarang ito, hindi magkakaroon ng mga pagbubukod sa blacklist mula sa patakarang 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">Payagan ang user ng enterprise na maging pangunahing multiprofile na user lang (Default na pag-uugali para sa mga user na pinamamahalaan ng enterprise)</translation>
+<translation id="8191318459035150777">Kino-configure ang URL ng default na home page sa <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user na mapalitan ito.
+
+          Ang home page ay ang page na binubuksan ng button ng Home. Pinamamahalaan ng mga patakaran ng RestoreOnStartup ang mga bumubukas na page sa startup.
+
+          Maaaring itakda ang uri ng home page sa isang URL na tutukuyin mo rito, o kaya, maaari itong itakda sa Page ng Bagong Tab. Kung pipiliin mo ang Page ng Bagong Tab, hindi mailalapat ang patakarang ito.
+
+          Kung ie-enable mo ang setting na ito, hindi na mapapalitan at magagawang <ph name="PRODUCT_NAME" /> ng mga user ang URL ng kanilang home page, ngunit kung gugustuhin nila, magagamit pa rin nila ang Page ng Bagong Tab bilang kanilang home page.
+
+          Kapag hindi mo itinakda ang patakarang ito at wala ring nakatakdang HomepageIsNewTabPage, mabibigyang-daan ang user na pumili ng sarili niyang home page.
+
+          Hindi available ang patakarang ito sa mga instance ng Windows na hindi kasama
+          sa isang Active Directory domain.</translation>
 <translation id="8197918588508433925">Tinutukoy ng patakarang ito ang mga pinapayagang extension upang magamit ang Enterprise Platform Keys API chrome.enterprise.platformKeysPrivate.challengeUserKey() para sa malayuang pagpapatunay. Dapat magdagdag ng mga extension sa listahang ito upang magamit ang API.
 
           Kung wala sa listahan ang isang extension, o hindi nakatakda ang listahan, mabibigo ang pagtawag sa API nang may code ng error.</translation>
@@ -2164,6 +2184,8 @@
           Kung pinagana mo ang setting na ito, lalaktawan ang paghahanap ng CNAME at gagamitin ang pangalan ng server tulad ng inilagay.
 
           Kung hindi mo pinagana ang setting na ito o hinayaan itong hindi nakatakda, tutukuyin sa pamamagitan ng paghahanap ng CNAME ang canonical na pangalan ng server.</translation>
+<translation id="8774131509736383471">Kung itatakda sa true ang patakarang ito, ima-maximize ng <ph name="PRODUCT_NAME" /> ang unang lalabas na window sa unang pagpapatakbo nang walang limitasyon.
+      Kung itatakda sa false o kung hindi iko-configure ang patakarang ito, ibabatay sa laki ng screen ang pasya tungkol sa pagma-maximize sa unang lalabas na window.</translation>
 <translation id="8777120694819070607">Pinapayagan ng <ph name="PRODUCT_NAME" /> upang magpatakbo ng mga plugin na wala na sa panahon. Kung pinagana mo ang setting na ito, hindi gagamitin ang mga hindi napapanahong plugin at hihingi ng pahintulot ang mga user na patakbuhin ang mga ito. Kung hindi naitakada ang setting na ito, hihingan ng pahintulot ang mga user na magpatakbo ng mga hindi napapanahong plugin</translation>
 <translation id="87812015706645271">Kinakailangan nito na nagtutugma ang pangalan ng lokal na user at ang may-ari ng host ng malayuang pag-access</translation>
 <translation id="8782750230688364867">Tinutukoy ang porsyento ng pag-scale ng pag-antala bago magdilim ang screen kapag nasa presentation mode ang device.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index eb47a52..9279bcf3 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -56,6 +56,9 @@
 <translation id="1221359380862872747">Muat url yang ditentukan di proses masuk demo</translation>
 <translation id="1240643596769627465">Menentukan URL mesin telusur yang digunakan untuk memberikan hasil sekejap. URL harus berisi string <ph name="SEARCH_TERM_MARKER" />, yang akan diganti pada waktu kueri dengan teks yang dimasukkan oleh pengguna hingga saat ini. Kebijakan ini bersifat opsional. Jika tidak disetel, tidak ada hasil penelusuran sekejap yang akan disediakan. Kebijakan ini hanya diterapkan jika kebijakan 'DefaultSearchProviderEnabled' diaktifkan.</translation>
 <translation id="1265053460044691532">Batasi waktu bagi pengguna yang diautentikasi melalui SAML untuk dapat masuk saat offline.</translation>
+<translation id="1291880496936992484">Peringatan: RC4 akan dihapus sepenuhnya dari <ph name="PRODUCT_NAME" /> setelah versi 52 (sekitar September 2016) dan kebijakan ini tidak akan berlaku.
+
+      Jika kebijakan tidak disetel, atau disetel ke False, cipher suite RC4 di TLS tidak akan diaktifkan. Jika kebijakan disetel ke True, kebijakan akan tetap berlaku untuk mempertahankan kompatibilitas dengan server yang usang. Ini adalah tindakan sementara dan server sebaiknya dikonfigurasi ulang.</translation>
 <translation id="1297182715641689552">Gunakan skrip proxy .pac</translation>
 <translation id="1300635491585192248">Memprediksi tindakan jaringan pada jaringan apa pun selain jaringan
           seluler</translation>
@@ -470,6 +473,9 @@
       Jika Anda mengaktifkan atau menonaktifkan setelan ini, pengguna tidak dapat mengubah atau menimpa setelan "Aktifkan perlindungan phishing dan perangkat lunak perusak" di <ph name="PRODUCT_NAME" />.
 
       Jika kebijakan ini tidak disetel, kebijakan akan diaktifkan namun pengguna dapat mengubahnya.</translation>
+<translation id="2801230735743888564">Mengizinkan pengguna memainkan game dinosaur easter egg saat perangkat offline.
+
+      Jika kebijakan ini disetel ke False, pengguna tidak akan dapat memainkan game dinosaur easter egg saat perangkat offline. Jika setelan ini disetel ke True, pengguna dapat memainkan game tersebut. Jika kebijakan ini tidak disetel, pengguna tidak dapat memainkan game dinosaur easter egg pada Chrome OS yang terdaftar, tapi pengguna dapat memainkannya dalam situasi tertentu.</translation>
 <translation id="2805707493867224476">Izinkan semua situs menampilkan munculan</translation>
 <translation id="2808013382476173118">Memungkinkan penggunaan server STUN saat klien jarak jauh mencoba untuk membuat koneksi ke komputer ini.
 
@@ -1003,6 +1009,7 @@
           Saat kebijakan tidak disetel, tindakan default diambil, yaitu yang ditangguhkan
 
           Jika tindakan ditangguhkan, <ph name="PRODUCT_OS_NAME" /> dapat dikonfigurasikan secara terpisah baik layar terkunci atau pun tidak sebelum penangguhan.</translation>
+<translation id="5130288486815037971">Baik cipher suite RC4 di TLS diaktifkan</translation>
 <translation id="5141670636904227950">Menyetel jenis lup default yang diaktifkan di layar masuk</translation>
 <translation id="5142301680741828703">Selalu mengurai pola URL berikut di <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Memungkinkan Anda menentukan parameter tambahan yang digunakan saat <ph name="PRODUCT_FRAME_NAME" /> meluncurkan <ph name="PRODUCT_NAME" />.
@@ -1261,6 +1268,7 @@
           Cara yang disarankan untuk mengunci layar saat menganggur adalah dengan mengaktifkan penangguhan penguncian layar dan meminta <ph name="PRODUCT_OS_NAME" /> menangguhkan setelah penundaan waktu menganggur. Sebaiknya hanya gunakan kebijakan ini saat penguncian layar perlu terjadi jauh lebih awal dibandingkan penangguhan atau saat penangguhan ketika menganggur tidak diinginkan sama sekali.
 
           Nilai kebijakan harus ditetapkan dalam milidetik. Nilai dijepit agar kurang dari penundaan waktu menganggur.</translation>
+<translation id="6111936128861357925">Izinkan Game Dinosaur Easter Egg</translation>
 <translation id="6114416803310251055">tak lagi digunakan</translation>
 <translation id="6145799962557135888">Memungkinkan Anda menyetel daftar pola url yang menentukan situs yang tidak diizinkan untuk menjalankan JavaScript. Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs, baik dari kebijakan 'DefaultJavaScriptSetting', jika disetel, ataupun dari konfigurasi pribadi pengguna.</translation>
 <translation id="6151775819333710697">
@@ -1805,6 +1813,18 @@
 
       Jika kebijakan ini tidak disetel, tidak akan ada pengecualian untuk daftar hitam dari kebijakan 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">Memungkinkan pengguna perusahaan menjadi pengguna banyak profil primer saja (Perilaku default untuk pengguna yang dikelola perusahaan)</translation>
+<translation id="8191318459035150777">Mengonfigurasi URL beranda default di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubahnya.
+
+          Beranda adalah laman yang dibuka dengan tombol Beranda. Laman yang dibuka saat memulai perangkat akan dikontrol oleh kebijakan RestoreOnStartup.
+
+          Jenis beranda dapat disetel ke URL yang Anda tetapkan di sini atau disetel ke Laman Tab Baru. Jika Anda memilih Laman Tab Baru, kebijakan ini tidak akan berlaku.
+
+          Jika Anda mengaktifkan setelan ini, pengguna tidak dapat mengubah URL beranda di <ph name="PRODUCT_NAME" />, tapi pengguna dapat memilih Laman Tab Baru sebagai beranda.
+
+          Membiarkan kebijakan ini tidak disetel akan memungkinkan pengguna memilih beranda sendiri jika HomepageIsNewTabPage juga tidak disetel.
+
+          Kebijakan ini tidak tersedia di Jendela yang tidak digabungkan
+          ke domain Directori Aktif.</translation>
 <translation id="8197918588508433925">Kebijakan ini menentukan ekstensi yang diizinkan untuk menggunakan API Kunci Platform Perusahaan chrome.enterprise.platformKeysPrivate.challengeUserKey() untuk pengesahan jarak jauh. Ekstensi harus ditambahkan ke daftar ini untuk menggunakan API.
 
           Jika ekstensi tidak ada dalam daftar, atau daftar tidak disetel, panggilan ke API akan gagal dengan suatu kode kesalahan.</translation>
@@ -1905,6 +1925,8 @@
 
       Jika setelan ini dinonaktifkan, riwayat penjelajahan dan unduhan tidak dapat dihapus.</translation>
 <translation id="8764119899999036911">Menentukan apakah Kerberos SPN yang dihasilkan didasarkan pada nama DNS kanonik atau nama asli yang dimasukkan. Jika Anda mengaktifkan setelan ini, pencarian CNAME akan dilewati dan nama server akan digunakan seperti saat dimasukkan. Jika Anda menonaktifkan setelan ini atau membiarkannya tidak disetel, nama kanonik server akan ditentukan melalui pencarian CNAME.</translation>
+<translation id="8774131509736383471">Jika kebijakan ini disetel ke True, <ph name="PRODUCT_NAME" /> akan memaksimalkan jendela yang ditampilkan pada percobaan pertama tanpa syarat.
+      Jika kebijakan ini disetel ke False atau tidak dikonfigurasi, keputusan untuk memaksimalkan jendela pertama akan ditampilkan menurut ukuran layar.</translation>
 <translation id="8777120694819070607">Mengizinkan <ph name="PRODUCT_NAME" /> menjalankan plugin yang kedaluwarsa. Jika Anda mengaktifkan setelan ini, plugin yang kedaluwarsa digunakan sebagai plugin normal. Jika Anda menonaktifkan setelan ini, plugin yang kedaluwarsa tidak akan digunakan dan pengguna tidak akan dimintai izin untuk menjalankannya. Jika setelan ini tidak disetel, pengguna akan dimintai izin untuk menjalankan plugin yang kedaluwarsa.</translation>
 <translation id="87812015706645271">Mewajibkan nama pengguna lokal cocok dengan  pemilik host akses jarak jauh</translation>
 <translation id="8782750230688364867">Menentukan persentase yang digunakan untuk menskalakan penundaan layar redup saat perangkat dalam mode presentasi.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index 9bfc830..06179ae 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -55,6 +55,9 @@
 <translation id="1221359380862872747">טען כתובות אתר מוגדרות עם הכניסה להדגמה</translation>
 <translation id="1240643596769627465">‏מציין את כתובת האתר של מנוע החיפוש שבו נעשה שימוש כדי לספק תוצאות מיידיות. כתובת האתר אמורה להכיל את המחרוזת <ph name="SEARCH_TERM_MARKER" /> , אשר תוחלף במועד השאילתה בטקסט שהמשתמש הזין עד כה. מדיניות זו היא אופציונלית. אם היא לא מוגדרת, לא יסופקו תוצאות חיפוש מיידיות. מדיניות זו תקפה רק אם המדיניות 'DefaultSearchProviderEnabled' מופעלת.</translation>
 <translation id="1265053460044691532">‏הגבל את משך הזמן שבמהלכו משתמש שאומת באמצעות SAML יכול להתחבר באופן לא מקוון.</translation>
+<translation id="1291880496936992484">‏אזהרה: RC4 יוסר לחלוטין מ-<ph name="PRODUCT_NAME" /> לאחר גרסה 52 (בסביבות ספטמבר 2016) ומדיניות זו תפסיק אז לפעול.
+
+      אם המדיניות לא תוגדר או תוגדר כ-false, חבילות הצופן של RC4 ב-TLS (אבטחת שכבת התעבורה) לא יופעלו. אחרת, אפשר להגדירה אותה כ-true כדי לשמור על תאימות לשרת מיושן. זהו פתרון זמני, יש להגדיר את השרת מחדש.</translation>
 <translation id="1297182715641689552">‏השתמש בסקריפט Proxy מסוג ‎.pac</translation>
 <translation id="1300635491585192248">חיזוי פעולות ברשת בכל רשת שאינה סלולרית</translation>
 <translation id="1304973015437969093">מזהי תוספים/אפליקציות וכתובות אתרים של עדכונים המיועדים להתקנה שקטה</translation>
@@ -457,6 +460,9 @@
       אם תפעיל או תשבית את ההגדרה הזו, המשתמשים לא יוכלו לשנות או לעקוף את ההגדרה "הפעל הגנה מפני דיוג ותוכנה זדונית" ב-<ph name="PRODUCT_NAME" />.
 
       אם תשאיר את המדיניות הזו לא מוגדרת, התכונה תופעל אך המשתמש יוכל לשנותה.</translation>
+<translation id="2801230735743888564">‏מאפשרת למשתמשים לשחק במשחק ביצי הפסחא של הדינוזאורים כשהמכשיר במצב לא מקוון.
+
+      אם המדיניות מוגדרת כ-False, המשתמשים לא יוכלו לשחק במשחק ביצי הפסחא של הדינוזאורים כשהמכשיר במצב לא מקוון. אם היא מוגדרת כ-True, המשתמשים יוכלו לשחק במשחק הדינוזאורים. אם המדיניות לא מוגדרת, המשתמשים לא יוכלו לשחק במשחק ביצי הפסחא של הדינוזאורים במערכות הפעלה רשומות של Chrome, אבל הם יוכלו לשחק במצבים אחרים.</translation>
 <translation id="2805707493867224476">אפשר לכל האתרים להציג חלונות קופצים</translation>
 <translation id="2808013382476173118">‏מאפשרת שימוש בשרתי STUN כאשר לקוחות מרוחקים מנסים ליצור חיבור עם המחשב הזה. 
 
@@ -976,6 +982,7 @@
           כאשר מדיניות זו אינה מוגדרת, ננקטת פעולת ברירת המחדל - השעיה.
 
           אם הפעולה היא השעיה, ניתן להגדיר את <ph name="PRODUCT_OS_NAME" /> בנפרד לנעול או לא לנעול את המסך לפני ההשעיה.</translation>
+<translation id="5130288486815037971">‏אם חבילות הצופן של RC4 מופעלות ב-TLS (אבטחת שכבת התעבורה)</translation>
 <translation id="5141670636904227950">הגדר את סוג מגדיל התצוגה המוגדר כברירת מחדל המופעל במסך ההתחברות</translation>
 <translation id="5142301680741828703">עבד תמיד את הדפוסים הבאים של כתובות האתר ב-<ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">מאפשר לך לציין פרמטרים נוספים הנמצאים בשימוש כאשר <ph name="PRODUCT_FRAME_NAME" /> מפעיל את <ph name="PRODUCT_NAME" />.
@@ -1229,6 +1236,7 @@
           הדרך המומלצת לנעול את המסך בזמן של חוסר פעילות היא להפעיל נעילת מסך בהשעייה, ולהגדיר את <ph name="PRODUCT_OS_NAME" /> לביצוע ההשעייה לאחר שחלף פרק הזמן של חוסר הפעילות. יש להשתמש במדיניות זו רק כאשר נעילת המסך צריכה להתרחש הרבה לפני ההשעייה, או כאשר אינך מעוניין להשתמש כלל בהשעייה בזמן חוסר פעילות.
 
           יש לציין את פרק הזמן באלפיות שנייה. הערכים צריכים להיות קטנים יותר מפרק הזמן של חוסר פעילות.</translation>
+<translation id="6111936128861357925">אפשר לשחק במשחק ביצי הפסחא של הדינוזאורים</translation>
 <translation id="6114416803310251055">הוצאה משימוש</translation>
 <translation id="6145799962557135888">‏מאפשר לך להגדיר רשימה של דפוסי כתובות אתר המפרטת אתרים עם אישור להפעיל JavaScript. אם מדיניות זו לא הוגדרה, המערכת תשתמש בערך ברירת המחדל הכללי עבור כל האתרים לפי המדיניות 'DefaultJavaScriptSetting' במקרה שהוגדרה, או לפי התצורה האישית שקבע המשתמש במקרה שלא הוגדרה.</translation>
 <translation id="6151775819333710697">
@@ -1759,6 +1767,18 @@
 
       אם לא תגדיר מדיניות זו כלל, לא יהיו חריגים לרשימה השחורה מהמדיניות 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">אפשר למשתמש ארגוני להיות משתמש ראשי ומרובה-פרופילים בלבד (התנהגות ברירת המחדל עבור משתמשים המנוהלים על ידי ארגון)</translation>
+<translation id="8191318459035150777">‏מגדירה את ברירת המחדל של כתובת האתר לדף הבית ב-<ph name="PRODUCT_NAME" /> ומונעת ממשתמשים לשנות אותה.
+
+          דף הבית הוא הדף שנפתח על ידי לחצן דף הבית. הדפים שנפתחים בעת אתחול נקבעים על ידי פריטי המדיניות RestoreOnStartup.
+
+          ניתן להגדיר את סוג דף הבית ככתובת אתר שאתה מגדיר כאן או כדף כרטיסייה חדשה. אם תבחר את דף הכרטיסייה החדשה, המדיניות הזו אינה רלוונטית.
+
+          אם תפעיל את ההגדרה הזו, משתמשים לא יוכלו לשנות את כתובת האתר של דף הבית ב-<ph name="PRODUCT_NAME" />, אבל הם יוכלו לבחור את דף הכרטיסייה החדשה כדף הבית.
+
+          אם המדיניות לא תוגדר, המשתמש יוכל לבחור את דף הבית בעצמו, אם גם המדיניות HomepageIsNewTabPage לא מוגדרת.
+
+          המדיניות הזו אינה זמינה במופעי Windows שאינם מצורפים לדומיין
+          של Active Directory.</translation>
 <translation id="8197918588508433925">‏מדיניות זו מציינת את התוספים המורשים לשימוש בממשק ה-API של Enterprise Platform Keys chrome.enterprise.platformKeysPrivate.challengeUserKey()‎ עבור הזדהות מרחוק. כדי שתוספים יוכלו להשתמש בממשק ה-API, יש להוסיף אותם לרשימה זו.
 
           אם תוסף אינו כלול ברשימה, או אם הרשימה אינה מוגדרת, הקריאה לממשק ה-API תיכשל בצירוף קוד שגיאה.</translation>
@@ -1858,6 +1878,8 @@
 
       אם ההגדרה הזו מושבתת, לא ניתן למחוק את היסטוריית הגלישה וההורדות.</translation>
 <translation id="8764119899999036911">‏מציין אם ה-Kerberos SPN שנוצר מבוסס על שם ה-DNS הקנוני או על השם המקורי שהוזן. אם תהפוך הגדרה זו לפעילה, המערכת תדלג על חיפוש CNAME ותשתמש בשם השרת כפי שהוזן. אם תשבית הגדרה זו או לא תגדיר אותה, שם הקנוני של השרת ייקבע באמצעות חיפוש CNAME.</translation>
+<translation id="8774131509736383471">‏אם מדיניות זו מוגדרת כ-True, ‏<ph name="PRODUCT_NAME" /> יגדיל למקסימום את החלון הראשון המוצג בהפעלה הראשונה ללא תנאים.
+      אם מדיניות זו מוגדרת כ-False או אינה מוגדרת, ההחלטה להגדיל למקסימום את החלון הראשון שמוצג תתבסס על גודל המסך.</translation>
 <translation id="8777120694819070607">המדיניות מאפשרת ל-<ph name="PRODUCT_NAME" /> להריץ יישומי פלאגין מיושנים. אם תהפוך הגדרה זו לפעילה, יישומי פלאגין מיושנים יהיו בשימוש כמו יישומי פלאגין רגילים. אם תשבית הגדרה זו, יישומי פלאגין מיושנים לא יהיו בשימוש והמשתמשים לא יתבקשו לספק הרשאות כדי להריץ אותם. אם הגדרה זו לא נקבעה, המשתמשים יתבקשו לספק הרשאות להרצת יישומי פלאגין מיושנים.</translation>
 <translation id="87812015706645271">מדיניות זו מחייבת התאמה בין השם של המשתמש המקומי והשם של בעל המארח לגישה מרחוק</translation>
 <translation id="8782750230688364867">הגדרת האחוז שלפיו יש לדרג את ההשהיה לפני עמעום המסך כשהמכשיר במצב מצגת.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index 80612c6..ec6fb3a6 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -64,6 +64,9 @@
 
           Dasar ini hanya dihormati jika dasar 'DefaultSearchProviderEnabled' didayakan.</translation>
 <translation id="1265053460044691532">Hadkan masa untuk pengguna yang membuat pengesahan melalui SAML boleh melog masuk dalam talian.</translation>
+<translation id="1291880496936992484">Amaran: RC4 akan dialih keluar sepenuhnya daripada <ph name="PRODUCT_NAME" /> selepas versi 52 (sekitar September 2016) dan dasar ini akan berhenti berfungsi selepas itu.
+
+      Jika dasar ini tidak ditetapkan atau ditetapkan kepada palsu, maka suit sifer RC4 dalam TLS tidak akan didayakan. Jika tidak, dasar mungkin ditetapkan kepada benar untuk mengekalkan keserasian dengan pelayan yang lapuk. Ini adalah langkah sementara dan pelayan harus dikonfigurasi semula.</translation>
 <translation id="1297182715641689552">Gunakan skrip proksi .pac</translation>
 <translation id="1300635491585192248">Ramalkan tindakan rangkaian pada mana-mana rangkaian yang bukan
           selular</translation>
@@ -527,6 +530,9 @@
       Jika anda mendayakan atau melumpuhkan tetapan ini, pengguna tidak boleh mengubah atau mengatasi tetapan "Dayakan perlindungan pancingan data dan perlindungan perisian hasad" dalam <ph name="PRODUCT_NAME" />.
 
       Jika dasar ini dibiarkan tanpa ditetapkan, tetapan ini akan didayakan tetapi pengguna akan dapat mengubahnya.</translation>
+<translation id="2801230735743888564">Membolehkan pengguna bermain permainan telur easter dinosaur apabila peranti di luar talian.
+
+      Jika dasar ini ditetapkan kepada Palsu, pengguna tidak akan dapat bermain permainan telur easter dinosaur apabila peranti di luar talian. Jika tetapan ini ditetapkan kepada Benar, pengguna dibenarkan bermain permainan dinosaur. Jika dasar ini tidak ditetapkan, pengguna tidak dibenarkan bermain permainan telur easter dinosaur pada OS Chrome berdaftar, tetapi dibenarkan bermain menurut keadaan lain.</translation>
 <translation id="2805707493867224476">Membenarkan semua tapak untuk memaparkan pop muncul</translation>
 <translation id="2808013382476173118">Mendayakan penggunaan pelayan STUN apabila pelanggan jauh cuba mewujudkan sambungan dengan mesin ini.
 
@@ -1134,6 +1140,7 @@
           Apabila dasar ini tidak ditetapkan, tindakan lalai iaitu penggantungan akan diambil.
 
           Jika tindakan penggantungan diambil, <ph name="PRODUCT_OS_NAME" /> boleh dikonfigurasi secara berasingan sama ada kepada mengunci atau tidak mengunci skrin sebelum penggantungan.</translation>
+<translation id="5130288486815037971">Sama ada suit sifer RC4 dalam TLS didayakan</translation>
 <translation id="5141670636904227950">Tetapkan jenis penggadang skrin lalai yang didayakan pada skrin log masuk</translation>
 <translation id="5142301680741828703">Sentiasa paparkan corak URL berikut dalam <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Membolehkan anda menentukan parameter tambahan yang digunakan apabila  <ph name="PRODUCT_FRAME_NAME" /> melancarkan <ph name="PRODUCT_NAME" />.
@@ -1419,6 +1426,7 @@
           Cara yang disyorkan untuk mengunci skrin semasa melahu adalah dengan mendayakan penguncian skrin semasa tergantung dan membuatkan <ph name="PRODUCT_OS_NAME" /> tergantung selepas kelewatan melahu. Dasar ini harus digunakan hanya apabila penguncian skrin berlaku jauh lebih awal daripada masa tergantung atau apabila tergantung yang berlaku semasa melahu tidak diingini sama sekali.
 
           Nilai dasar mesti dinyatakan dalam milisaat. Nilai diketatkan menjadi kurang daripada kelewatan melahu.</translation>
+<translation id="6111936128861357925">Benarkan Permainan Telur Easter Dinosaur</translation>
 <translation id="6114416803310251055">dikecam</translation>
 <translation id="6145799962557135888">Membolehkan anda menetapkan senarai pola url yang menentukan tapak yang dibenarkan untuk menjalankan JavaScript.
 
@@ -2050,6 +2058,19 @@
 
       Jika dasar ini tidak ditetapkan, tiada pengecualian untuk senarai hitam daripada dasar 'URLBlacklist'.</translation>
 <translation id="8176035528522326671">Membenarkan pengguna perusahaan untuk menjadi pengguna berbilang profil utama sahaja (Tingkah laku lalai untuk pengguna perusahaan yang dikendalikan)</translation>
+<translation id="8191318459035150777">Mengkonfigurasi URL halaman utama lalai dalam <ph name="PRODUCT_NAME" /> dan menghalang pengguna daripada menukarnya.
+
+          Halaman utama ialah laman yang dibuka oleh butang Laman Utama. 
+Halaman yang dibuka semasa permulaan dikawal oleh dasar RestoreOnStartup.
+
+          Jenis halaman utama boleh ditetapkan kepada URL yang anda tentukan di sini atau ditetapkan kepada Halaman Tab Baharu. Jika anda memilih Halaman Tab Baharu, maka dasar ini tidak berkuat kuasa.
+
+          Jika anda mendayakan tetapan ini, pengguna tidak boleh menukar URL halaman utama mereka dalam <ph name="PRODUCT_NAME" />, tetapi mereka masih boleh memilih Halaman Tab Baharu sebagai halaman utama mereka.
+
+          Jika dasar ini dibiarkan tanpa ditetapkan, pengguna boleh memilih halaman utamanya sendiri jika HomepageIsNewTabPage turut tidak ditetapkan.
+
+          Dasar ini tidak tersedia pada tika Windows yang tidak dihubungkan
+          ke domain Direktori Aktif.</translation>
 <translation id="8197918588508433925">Dasar ini menentukan sambungan yang dibenarkan menggunakan API Enterprise Platform Keys chrome.enterprise.platformKeysPrivate.challengeUserKey() untuk pembuktian jauh. Sambungan hendaklah ditambahkan pada senarai ini untuk penggunakan API tersebut.
 
           Jika sambungan tidak terdapat dalam senarai atau senarai tidak ditetapkan, panggilan kepada API tersebut akan gagal dengan kod ralat.</translation>
@@ -2167,6 +2188,8 @@
           Jika anda mendayakan tetapan ini, carian CNAME akan dilangkau dan nama pelayan akan digunakan seperti mana ia dimasukkan.
 
           Jika anda melumpuhkan tetapan ini atau membiarkannya tanpa ditetapkan, nama berkanun pelayan akan ditentukan melalui carian CNAME.</translation>
+<translation id="8774131509736383471">Jika dasar ini ditetapkan kepada benar, <ph name="PRODUCT_NAME" /> akan memaksimumkan tetingkap pertama yang dipaparkan pada kendalian pertama tanpa syarat.
+     Jika dasar ini ditetapkan kepada palsu atau tidak dikonfigurasi, keputusan sama ada untuk memaksimumkan tetingkap pertama yang ditunjukkan akan berdasarkan saiz skrin.</translation>
 <translation id="8777120694819070607">Membenarkan <ph name="PRODUCT_NAME" /> untuk menjalankan pemalam yang lapuk.
 
       Jika anda mendayakan tetapan ini, pemalam lapuk digunakan sebagai pemalam normal.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 02a2c94..f758943 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -63,6 +63,9 @@
 
           Toto pravidlo bude dodržané len v prípade, ak je povolené pravidlo „DefaultSearchProviderEnabled“.</translation>
 <translation id="1265053460044691532">Stanovte časový limit prihlásenia v režime offline pre používateľa, ktorého totožnosť bola overená prostredníctvom štandardu SAML</translation>
+<translation id="1291880496936992484">Upozornenie: Po verzii 52 (približne v septembri 2016) bude šifrovací algoritmus RC4 z prehliadača <ph name="PRODUCT_NAME" /> úplne odstránený a toto pravidlo prestane fungovať.
+
+      Ak toto pravidlo nie je nastavené alebo je nastavené na hodnotu False, v protokole TLS nebudú povolené šifrovacie súpravy RC4. Nastavením tohto pravidla na hodnotu True je možné zaistiť kompatibilitu so zastaraným serverom. Ide o krátkodobé riešenie, takže konfigurácia príslušného servera by mala byť upravená.</translation>
 <translation id="1297182715641689552">Použiť skript servera proxy vo formáte PAC</translation>
 <translation id="1300635491585192248">Predvídať akcie všetkých sietí, ktoré nie sú
           mobilné</translation>
@@ -527,6 +530,9 @@
       Ak toto pravidlo povolíte alebo zakážete, používatelia ho pomocou nastavenia „Povoliť ochranu pred phishingom a škodlivým softvérom“ v prehliadači <ph name="PRODUCT_NAME" /> nebudú môcť zmeniť.
 
       Ak toto pravidlo ponecháte nenastavené, funkcia bude povolená, ale používateľ to bude môcť zmeniť.</translation>
+<translation id="2801230735743888564">Povoľte používateľom hrať veľkonočnú hru s dinosaurom, keď je zariadenie offline.
+
+      Ak je toto pravidlo nastavené na hodnotu False, používatelia nebudú môcť hrať veľkonočnú hru s dinosaurom, keď je zariadenie offline. Ak je toto pravidlo nastavené na hodnotu True, používatelia môžu hrať hru s dinosaurom. Ak toto pravidlo nie je nastavené, v zaregistrovanom systéme Chrome OS používatelia veľkonočnú hru s dinosaurom hrať nemôžu, ale za všetkých iných okolností ju hrať môžu.</translation>
 <translation id="2805707493867224476">Povoliť všetkým webovým stránkam zobrazovať kontextové okná</translation>
 <translation id="2808013382476173118">Povoľuje použitie serverov typu STUN, keď sa vzdialení klienti pokúšajú nadviazať spojenie s týmto počítačom.
 
@@ -1120,6 +1126,7 @@
           Keď nie je toto pravidlo nastavené, vykoná sa predvolená akcia – pozastavenie.
 
           Ak dôjde k pozastaveniu, <ph name="PRODUCT_OS_NAME" /> je možné samostatne nakonfigurovať, aby pred pozastavením obrazovku buď zamkol, alebo nezamkol.</translation>
+<translation id="5130288486815037971">Ovláda, či sú v protokole TLS povolené šifrovacie súpravy RC4</translation>
 <translation id="5141670636904227950">Nastaviť predvolený typ lupy obrazovky, ktorý je povolený na prihlasovacej obrazovke</translation>
 <translation id="5142301680741828703">Vždy vykreslovať nasledujúce vzory webových adries v doplnku <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Umožňuje nastaviť dodatočné parametre, ktoré doplnok <ph name="PRODUCT_FRAME_NAME" /> pri spúšťaní aplikácie <ph name="PRODUCT_NAME" /> použije.
@@ -1403,6 +1410,7 @@
           Odporúčaný spôsob uzamknutia obrazovky pri nečinnosti je povoliť uzamknutie obrazovky pri pozastavení a pozastaviť tak systém <ph name="PRODUCT_OS_NAME" /> po uplynutí času nečinnosti. Toto pravidlo použite iba v prípade, že chcete obrazovku uzamknúť podstatne skôr ako má dôjsť k pozastaveniu, alebo v prípade, že pozastavenie pri nečinnosti nechcete vôbec používať.
 
           Hodnota tohto pravidla sa zadáva v milisekundách. Ak zadáte hodnotu vyššiu ako je čas nečinnosti, použije sa hodnota času nečinnosti.</translation>
+<translation id="6111936128861357925">Povoliť hru s dinosaurom</translation>
 <translation id="6114416803310251055">zamietnuté</translation>
 <translation id="6145799962557135888">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu spúšťať kód JavaScript.
 
@@ -2033,6 +2041,17 @@
 
       Ak toto pravidlo ponecháte nenastavené, nebudú k dispozícii žiadne výnimky pre zoznam zakázaných adries uvedený v rámci pravidla URLBlacklist.</translation>
 <translation id="8176035528522326671">Povolí používateľovi v podnikovej sieti stať sa iba hlavným používateľom s viacerými profilmi (predvolené správanie pre používateľov spravovaných podnikom)</translation>
+<translation id="8191318459035150777">Konfiguruje predvolenú webovú adresu domovskej stránky prehliadača <ph name="PRODUCT_NAME" /> a zabraňuje používateľom jej úpravu.
+
+          Domovská stránka je stránka, ktorá sa zobrazí po kliknutí na tlačidlo Domovská stránka. Stránky, ktoré sa otvoria po spustení, sú ovládané pravidlami RestoreOnStartup.
+
+          Typ domovskej stránky môže byť nastavený buď na tu uvedenú webovú adresu, alebo na stránku na novej karte. Ak vyberiete stránku na novej karte, toto pravidlo sa neuplatní.
+
+          Ak toto nastavenie povolíte, používatelia nebudú môcť v prehliadači <ph name="PRODUCT_NAME" /> zmeniť webovú adresu domovskej stránky, budú však stále môcť nastaviť svoju domovskú stránku na stránku na novej karte.
+
+          Ak ponecháte toto pravidlo nenastavené, umožní to používateľovi zvoliť si domovskú stránku samostatne v prípade, že nie je nastavené ani pravidlo HomepageIsNewTabPage.
+
+          Toto pravidlo nie je k dispozícii v inštanciách systému Windows, ktoré nie sú pripojené k doméne Active Directory.</translation>
 <translation id="8197918588508433925">Toto pravidlo určuje, pre ktoré rozšírenia bude povolené vzdialené prihlásenie pomocou metódy chrome.enterprise.platformKeysPrivate.challengeUserKey() rozhrania Enterprise Platform Keys API. Aby mohli rozšírenia používať toto rozhranie API, musia byť pridané do tohto zoznamu.
 
           Ak sa rozšírenie na zozname nenachádza alebo zoznam nie je vytvorený, volania rozhrania API zlyhajú a nahlásia kód chyby.</translation>
@@ -2149,6 +2168,8 @@
           Ak toto nastavenie povolíte, vyhľadávanie záznamov CNAME sa preskočí a použije sa zadaný názov servera.
 
           Ak toto nastavenie zakážete alebo ho ponecháte nenastavené, kanonický názov servera sa určí prostredníctvom vyhľadávania záznamov CNAME.</translation>
+<translation id="8774131509736383471">Ak je toto pravidlo nastavené na hodnotu True, prehliadač <ph name="PRODUCT_NAME" /> sa vždy pokúsi pri prvom spustení maximalizovať prvé okno.
+      Ak je toto pravidlo nastavené na hodnotu False alebo nie je nakonfigurované, o maximalizácii prvého zobrazeného okna sa rozhodne podľa veľkosti obrazovky.</translation>
 <translation id="8777120694819070607">Umožňuje prehliadaču <ph name="PRODUCT_NAME" /> spúšťať zastarané doplnky. Ak toto nastavenie povolíte, zastarané doplnky budú použité ako normálne. Ak toto nastavenie zakážete, zastarané doplnky nebude možné použiť a používateľom sa ani nezobrazí žiadosť o povolenie spustenia doplnku. Ak toto nastavenie nie je nakonfigurované, používateľom sa pri spustení zastaraného doplnku zobrazí žiadosť o povolenie tejto akcie.</translation>
 <translation id="87812015706645271">Vyžaduje, aby sa meno miestneho používateľa a vlastníka hostiteľa vzdialeného prístupu zhodovali</translation>
 <translation id="8782750230688364867">Určuje percentuálnu hodnotu, o ktorú sa predĺži oneskorenie stmavenia obrazovky, keď je zariadenie v režime prezentácie.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 7d1fdc1c6..3651e819 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -64,6 +64,9 @@
 
           Policyn används bara om policyn DefaultSearchProviderEnabled är aktiverad.</translation>
 <translation id="1265053460044691532">Begränsa tiden som en användare som verifierats via SAML kan logga in offline</translation>
+<translation id="1291880496936992484">Varning: RC4 kommer att helt tas bort från <ph name="PRODUCT_NAME" /> efter version 52 (kring september 2016) och den här principen upphör då att fungera.
+
+      Om principen inte har ställts in eller är inställd på falskt kommer RC4-krypteringssviter inte att aktiveras. Principen kan ställas in som sant om kompatibilitet med en föråldrad server önskas bibehållas. Detta är en nödlösning, och servern bör omkonfigureras.</translation>
 <translation id="1297182715641689552">Använd en PAC-proxyskript</translation>
 <translation id="1300635491585192248">Förutsäg nätverksåtgärder i ett nätverk som inte
           är ett mobilnätverk</translation>
@@ -530,6 +533,9 @@
       Om du aktiverar eller inaktiverar den här inställningen kan användarna inte ändra eller åsidosätta inställningen ”Aktivera skydd mot lösenordsfiske och skadlig programvara” i <ph name="PRODUCT_NAME" />.
 
       Om den här principen inte anges är den aktiverad, men användarna kan ändra den.</translation>
+<translation id="2801230735743888564">Tillåt användare att spela påskäggsspelet med dinosaurier när enheten är offline.
+
+      Om den här principen är inställd på falskt kommer användare inte att kunna spela påskäggsspelet med dinosaurier när enheten är offline. Om principen är inställd på sant kommer användare att kunna spela dinosauriespelet. Om principen inte tillämpas kommer användare inte att kunna spela påskäggsspelet med dinosaurier på Chrome OS med registrering, men kan spela det under andra omständigheter.</translation>
 <translation id="2805707493867224476">Tillåt alla webbplatser att visa popup-fönster</translation>
 <translation id="2808013382476173118">Policyn gör att STUN-servrar kan användas när fjärrklienter försöker upprätta en anslutning till den här datorn.
 
@@ -1139,6 +1145,7 @@
           När policyn inte har angetts kommer standardåtgärden avstängning att vidtas.
 
           Om åtgärden är avstängning kan <ph name="PRODUCT_OS_NAME" /> konfigureras separat för att antingen låsa eller inte låsa skärmen före avstängningen.</translation>
+<translation id="5130288486815037971">Om RC4-krypteringssviter i TLS är aktiverade eller inte</translation>
 <translation id="5141670636904227950">Ange standardtypen för skärmförstoraren på inloggningsskärmen</translation>
 <translation id="5142301680741828703">Rendera alltid följande webbadressmönster i <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Innebär att du kan ange ytterligare parametrar som används när <ph name="PRODUCT_FRAME_NAME" /> startar <ph name="PRODUCT_NAME" />.
@@ -1428,6 +1435,7 @@
           Det rekommenderade sättet att låsa skärmen vid inaktivitet är att aktivera skärmlåsning när appen skickas till bakgrunden och sätta <ph name="PRODUCT_OS_NAME" /> i viloläge efter en viss tids inaktivitet. Den här policyn bör endast användas när du vill att skärmen ska låsas mycket tidigare än viloläget startas eller när du inte vill att appen ska skickas till bakgrunden vid inaktivitet.
 
           Policyvärdet ska anges i millisekunder. Värdena har skurits ned så att de är mindre än fördröjningen innan viloläget.</translation>
+<translation id="6111936128861357925">Tillåt påskäggsspelet med dinosaurier</translation>
 <translation id="6114416803310251055">föråldrad</translation>
 <translation id="6145799962557135888">Policyn gör att du kan ange en lista med webbadressmönster som anger webbplatser som får köra JavaScript.
 
@@ -2062,6 +2070,18 @@
 
       Om den här policyn inte anges görs inga undantag från policyn URLBlacklist.</translation>
 <translation id="8176035528522326671">Tillåt en företagsanvändare att vara enbart primär flerprofilsanvändare (standardbeteendet för företagshanterade användare)</translation>
+<translation id="8191318459035150777">Konfigurerar webbadressen som är standard för startsidan i <ph name="PRODUCT_NAME" /> och förhindrar att användare ändrar den.
+
+          Startsidan är sidan som du öppnar med knappen Startsida. Sidorna som öppnas styrs av principen RestoreOnStartup.
+
+          Startsidans typ kan ställas in på en webbadress som du anger här eller på sidan Ny flik. Om du väljer sidan Ny flik ignoreras den här principen.
+
+          Om du aktiverar den här inställningen kan användarna inte ändra sin startsideadress i <ph name="PRODUCT_NAME" />, men de kan välja sidan Ny flik som startsida.
+
+          Om den här principen inte anges kan användarna själva välja sin startsida, förutsatt att inte HomepageIsNewTabPage har angetts.
+
+          Principen är inte tillgänglig på Windows-instanser som inte är anslutna
+          till en Active Directory-domän.</translation>
 <translation id="8197918588508433925">Policyn specificerar vilka tillägg som får använda API:et för Enterprise Platform Keys – chrome.enterprise.platformKeysPrivate.challengeUserKey() – för fjärrattestering. Tillägg måste anges på den här listan om de ska kunna använda API:et.
 
           Om ett tillägg inte finns med på listan, eller om listan inte har fastställts, kommer anslutningen till API:et att misslyckas och en felkod att visas.</translation>
@@ -2179,6 +2199,8 @@
           Om du aktiverar inställningen hoppas CNAME-sökningen över och servernamnet som angavs används.
 
           Om du inaktiverar inställningen eller inte anger den avgörs serverns kanoniska namn av en CNAME-sökning.</translation>
+<translation id="8774131509736383471">Om principen är inställd på sant kommer <ph name="PRODUCT_NAME" /> ovillkorligen första gången den körs att maximera det först visade fönstret.
+      Om principen är inställd på falskt eller inte konfigurerad kommer skärmstorleken att avgöra om det först visade fönstret ska maximeras.</translation>
 <translation id="8777120694819070607">Innebär att föråldrade plugin-program kan köras i <ph name="PRODUCT_NAME" />.
 
       Om du aktiverar den här inställningen kan föråldrade plugin-program användas som vanliga plugin-program.
diff --git a/components/precache/content/precache_manager_unittest.cc b/components/precache/content/precache_manager_unittest.cc
index e7dc6d05..bccbbda 100644
--- a/components/precache/content/precache_manager_unittest.cc
+++ b/components/precache/content/precache_manager_unittest.cc
@@ -21,6 +21,7 @@
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/history_types.h"
 #include "components/precache/core/precache_switches.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "net/http/http_status_code.h"
@@ -146,8 +147,9 @@
                              net::URLRequestStatus::FAILED);
   }
 
-  content::TestBrowserThreadBundle test_browser_thread_bundle_;
+  // Must be declared first so that it is destroyed last.
   content::TestBrowserContext browser_context_;
+  content::TestBrowserThreadBundle test_browser_thread_bundle_;
   PrecacheManagerUnderTest precache_manager_;
   TestURLFetcherCallback url_callback_;
   net::FakeURLFetcherFactory factory_;
diff --git a/components/precache/core/precache_database_unittest.cc b/components/precache/core/precache_database_unittest.cc
index 50aeeacb..19d26d3b 100644
--- a/components/precache/core/precache_database_unittest.cc
+++ b/components/precache/core/precache_database_unittest.cc
@@ -95,12 +95,14 @@
   void RecordFetchFromCacheCellular(const GURL& url,
                                     const base::Time& fetch_time, int64 size);
 
+  // Must be declared first so that it is destroyed last.
+  base::ScopedTempDir scoped_temp_dir_;
+
   // Having this MessageLoop member variable causes base::MessageLoop::current()
   // to be set properly.
   base::MessageLoopForUI loop_;
 
   scoped_refptr<PrecacheDatabase> precache_database_;
-  base::ScopedTempDir scoped_temp_dir_;
   base::HistogramTester histograms_;
   base::HistogramTester::CountsMap expected_histogram_counts_;
 
diff --git a/components/security_interstitials/core/browser/resources/interstitial_v2.js b/components/security_interstitials/core/browser/resources/interstitial_v2.js
index c8a1ce52..e29ae8e 100644
--- a/components/security_interstitials/core/browser/resources/interstitial_v2.js
+++ b/components/security_interstitials/core/browser/resources/interstitial_v2.js
@@ -40,7 +40,7 @@
  * @param {string} e The key that was just pressed.
  */
 function handleKeypress(e) {
-  var BYPASS_SEQUENCE = 'danger';
+  var BYPASS_SEQUENCE = 'badidea';
   if (BYPASS_SEQUENCE.charCodeAt(keyPressState) == e.keyCode) {
     keyPressState++;
     if (keyPressState == BYPASS_SEQUENCE.length) {
diff --git a/components/startup_metric_utils.gypi b/components/startup_metric_utils.gypi
index 55763c8d..f70e7a0 100644
--- a/components/startup_metric_utils.gypi
+++ b/components/startup_metric_utils.gypi
@@ -5,7 +5,7 @@
 {
   'targets': [
     {
-      'target_name': 'startup_metric_utils',
+      'target_name': 'startup_metric_utils_browser',
       'type': 'static_library',
       'dependencies': [
         '../base/base.gyp:base',
@@ -14,8 +14,8 @@
         '..',
       ],
       'sources': [
-        'startup_metric_utils/startup_metric_utils.cc',
-        'startup_metric_utils/startup_metric_utils.h',
+        'startup_metric_utils/browser/startup_metric_utils.cc',
+        'startup_metric_utils/browser/startup_metric_utils.h',
       ],
     },
   ],
diff --git a/components/startup_metric_utils/BUILD.gn b/components/startup_metric_utils/browser/BUILD.gn
similarity index 87%
rename from components/startup_metric_utils/BUILD.gn
rename to components/startup_metric_utils/browser/BUILD.gn
index 428b2bd..258e2106 100644
--- a/components/startup_metric_utils/BUILD.gn
+++ b/components/startup_metric_utils/browser/BUILD.gn
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-source_set("startup_metric_utils") {
+source_set("browser") {
   sources = [
     "startup_metric_utils.cc",
     "startup_metric_utils.h",
diff --git a/components/startup_metric_utils/startup_metric_utils.cc b/components/startup_metric_utils/browser/startup_metric_utils.cc
similarity index 96%
rename from components/startup_metric_utils/startup_metric_utils.cc
rename to components/startup_metric_utils/browser/startup_metric_utils.cc
index 74233a3..122326e 100644
--- a/components/startup_metric_utils/startup_metric_utils.cc
+++ b/components/startup_metric_utils/browser/startup_metric_utils.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/startup_metric_utils/browser/startup_metric_utils.h"
 
 #include "base/containers/hash_tables.h"
 #include "base/environment.h"
@@ -268,9 +268,9 @@
 void RecordMainEntryTimeHistogram() {
   const int kLowWordMask = 0xFFFFFFFF;
   const int kLower31BitsMask = 0x7FFFFFFF;
-  DCHECK(!MainEntryPointTime().is_null());
+  DCHECK(!g_main_entry_point_time.Get().is_null());
   base::TimeDelta browser_main_entry_time_absolute =
-      MainEntryPointTime() - base::Time::UnixEpoch();
+      g_main_entry_point_time.Get() - base::Time::UnixEpoch();
 
   uint64 browser_main_entry_time_raw_ms =
       browser_main_entry_time_absolute.InMilliseconds();
@@ -323,9 +323,9 @@
 }
 
 void RecordMainEntryPointTime(const base::Time& time) {
-  DCHECK(MainEntryPointTime().is_null());
+  DCHECK(g_main_entry_point_time.Get().is_null());
   g_main_entry_point_time.Get() = time;
-  DCHECK(!MainEntryPointTime().is_null());
+  DCHECK(!g_main_entry_point_time.Get().is_null());
 }
 
 void RecordExeMainEntryPointTime(const base::Time& time) {
@@ -357,17 +357,16 @@
   // * Measure time from main entry rather than the OS' notion of process start.
   // * Only measure launches that occur 7 minutes after boot to try to avoid
   //   cases where Chrome is auto-started and IO is heavily loaded.
-  const base::Time dll_main_time = MainEntryPointTime();
   if (is_first_run) {
     UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
         UMA_HISTOGRAM_LONG_TIMES,
         "Startup.BrowserMessageLoopStartTimeFromMainEntry.FirstRun",
-        dll_main_time, time);
+        g_main_entry_point_time.Get(), time);
   } else {
     UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
         UMA_HISTOGRAM_LONG_TIMES,
-        "Startup.BrowserMessageLoopStartTimeFromMainEntry", dll_main_time,
-        time);
+        "Startup.BrowserMessageLoopStartTimeFromMainEntry",
+        g_main_entry_point_time.Get(), time);
   }
 
   // Record timings between process creation, the main() in the executable being
@@ -383,13 +382,13 @@
       // chrome.exe:main() to chrome.dll:main().
       UMA_HISTOGRAM_AND_TRACE_WITH_STARTUP_TEMPERATURE(
           UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ExeMainToDllMain",
-          exe_main_time, dll_main_time);
+          exe_main_time, g_main_entry_point_time.Get());
 
       // Process create to chrome.dll:main(). Reported as a histogram only as
       // the other two events above are sufficient for tracing purposes.
       UMA_HISTOGRAM_WITH_STARTUP_TEMPERATURE(
           UMA_HISTOGRAM_LONG_TIMES, "Startup.LoadTime.ProcessCreateToDllMain",
-          dll_main_time - process_creation_time);
+          g_main_entry_point_time.Get() - process_creation_time);
     }
   }
 }
diff --git a/components/startup_metric_utils/startup_metric_utils.h b/components/startup_metric_utils/browser/startup_metric_utils.h
similarity index 95%
rename from components/startup_metric_utils/startup_metric_utils.h
rename to components/startup_metric_utils/browser/startup_metric_utils.h
index 684046c..b071321 100644
--- a/components/startup_metric_utils/startup_metric_utils.h
+++ b/components/startup_metric_utils/browser/startup_metric_utils.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_STARTUP_METRIC_UTILS_STARTUP_METRIC_UTILS_H_
-#define COMPONENTS_STARTUP_METRIC_UTILS_STARTUP_METRIC_UTILS_H_
+#ifndef COMPONENTS_STARTUP_METRIC_UTILS_BROWSER_STARTUP_METRIC_UTILS_H_
+#define COMPONENTS_STARTUP_METRIC_UTILS_BROWSER_STARTUP_METRIC_UTILS_H_
 
 #include <string>
 
@@ -104,4 +104,4 @@
 
 }  // namespace startup_metric_utils
 
-#endif  // COMPONENTS_STARTUP_METRIC_UTILS_STARTUP_METRIC_UTILS_H_
+#endif  // COMPONENTS_STARTUP_METRIC_UTILS_BROWSER_STARTUP_METRIC_UTILS_H_
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index e80f586..6713e32 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">የግንብ ቀን</translation>
 <translation id="1549470594296187301">ይህን ባህሪ ለመጠቀም ጃቫስክሪፕት መንቃት አለበት።</translation>
 <translation id="1559528461873125649">እንደዚህ ያለ ፋይል ወይም አቃፊ የለም</translation>
+<translation id="1629803312968146339">ይህን ካርድ Chrome እንዲያስቀምጥልዎት ይፈልጋሉ?</translation>
 <translation id="1640180200866533862">የተጠቃሚ መምሪያዎች</translation>
 <translation id="1644184664548287040">የአውታረ መረቡ ውቅር ልክ ያልሆነ እና ሊመጣ የማይችል ነው።</translation>
 <translation id="1655462015569774233">{1,plural, =1{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ለማረጋገጥ አይችልም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ትላንትና ጊዜው አልፎበታል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት አሁን በ<ph name="CURRENT_DATE" /> ተቀናብሯል። ትክክል ይመስልዎታል? ትክክል ካልሆነ፣ የእርስዎን ስርዓት ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎ።}one{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ለማረጋገጥ አይችልም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አልፏል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት አሁን በ<ph name="CURRENT_DATE" /> ተቀናብሯል። ትክክል ይመስልዎታል? ትክክል ካልሆነ፣ የእርስዎን ስርዓት ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎ።}other{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ለማረጋገጥ አይችልም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አልፏል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት አሁን በ<ph name="CURRENT_DATE" /> ተቀናብሯል። ትክክል ይመስልዎታል? ትክክል ካልሆነ፣ የእርስዎን ስርዓት ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎ።}}</translation>
 <translation id="168841957122794586">የአገልጋይ እውቅና ማረጋገጫው ደካማ የሆነ ባለስውር መረጃ ቁልፍ ነው ያለው።</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> ላይ ያለው ገጽ እንዲህ ይላል፦</translation>
 <translation id="1706954506755087368">{1,plural, =1{ይህ አገልጋይ <ph name="DOMAIN" /> እንደሆነ ማረጋገጥ አልቻለም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው ከነገ የመጣ ነው ይላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።}one{ይህ አገልጋይ <ph name="DOMAIN" /> እንደሆነ ማረጋገጥ አልቻለም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው የወደፊት # ቀንኖች የመጣ ነው ይላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።}other{ይህ አገልጋይ <ph name="DOMAIN" /> እንደሆነ ማረጋገጥ አልቻለም፤ የደህንነት ማረጋገጫ እውቅና ማረጋገጫው የወደፊት # ቀንኖች የመጣ ነው ይላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።}}</translation>
 <translation id="1710259589646384581">ስርዓተ ክወና</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">የመመሪያ ወሰን አይደገፍም።</translation>
 <translation id="4120075327926916474">Chrome የድር ቅጾችን ለማጠናቅቅ ይህን የክሬዲት ካርድ መረጃ እንዲያስቀምጥ ይፈልጋሉ?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Chromium ይህን ካርድ እንዲያስቀምጥልዎት ይፈልጋሉ?</translation>
 <translation id="4171400957073367226">መጥፎ የማረጋገጫ ፊርማ</translation>
 <translation id="4196861286325780578">&amp;ውሰድን ድገም</translation>
 <translation id="4220128509585149162">ብልሽቶች</translation>
 <translation id="4250680216510889253">አይ</translation>
 <translation id="4258748452823770588">መጥፎ ፊርማ</translation>
+<translation id="4268298190799576220">Chrome የእርስዎን ካርድ በዚህ ጊዜ ላይ ለማረጋገጥ አልቻለም። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
 <translation id="4269787794583293679">(ምንም የተጠቃሚ ስም የለም)</translation>
 <translation id="4300246636397505754">የወላጅ አስተያየት ጥቆማዎች</translation>
 <translation id="4325863107915753736">ጽሑፉን ማግኘት አልተቻለም</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">የአገልጋይ እውቅና ማረጋገጫው በጣም ረጅም የሆነ የማረጋገጫ ጊዜ አለው።</translation>
 <translation id="6154808779448689242">የተመለሰው የመምሪያ ማስመሰያ ከአሁኑ ማስመሰያ ጋር አይዛመድም</translation>
 <translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation>
+<translation id="6218753634732582820">ከChromium ላይ አድራሻ ይወገድ?</translation>
 <translation id="6259156558325130047">&amp;ዳግም ደርድርን ድገም</translation>
 <translation id="6263376278284652872"><ph name="DOMAIN" /> እልባቶች</translation>
 <translation id="6282194474023008486">የፖስታ ኮድ</translation>
 <translation id="6337534724793800597">መምሪያዎችን በስም አጣራ</translation>
+<translation id="6342069812937806050">ልክ አሁን</translation>
 <translation id="6355080345576803305">የይፋዊ ክፍለ-ጊዜ መሻር</translation>
 <translation id="6387478394221739770">አዲስ የChrome ባህሪያትን ይፈልጋሉ? የቅድመ ይሁንታ ሰርጣችንን በchrome.com/beta ላይ ይሞክሩት።</translation>
 <translation id="6445051938772793705">አገር</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> ፍለጋ</translation>
 <translation id="6644283850729428850">ይህ መመሪያ ተቋርጧል።</translation>
 <translation id="6646897916597483132">በካርድዎ ፊት ላይ ያለውን ባለ4 አኃዝ CVCን ያስገቡ</translation>
+<translation id="6671697161687535275">የአስተያየት ጥቆማ ከChromium ይወገድ?</translation>
 <translation id="674375294223700098">ያልታወቀ የአገልጋይ እውቅና ማረጋገጫ ስህተት።</translation>
 <translation id="6753269504797312559">የመምሪያ እሴት</translation>
 <translation id="6831043979455480757">መተርጎም</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">መሣሪያ</translation>
 <translation id="6970216967273061347">ወረዳ</translation>
 <translation id="6973656660372572881">ሁለቱም ቋሚ ተኪ አገልጋዮች እና የ.pac ስክሪፕት ዩአርኤል ተገልጸዋል።</translation>
-<translation id="6980028882292583085">የJavaScript ማንቂያ</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> ጋር ለመድረስ ሞክረዋል፣ ነገር ግን አገልጋዩ አስተማማኝ ለመሆን የሚያስቸግር በጣም ረጅም የሆነ የማረጋገጫ ጊዜ ነው ያለው።</translation>
 <translation id="7087282848513945231">አውራጃ</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">የመገለጫ ዱካ</translation>
 <translation id="7441627299479586546">የተሳሳተ የመምሪያ ርዕሰ ጉዳይ</translation>
 <translation id="7485870689360869515">ምንም ውሂብ አልተገኘም።</translation>
-<translation id="7521387064766892559">ጃቫስክሪፕት</translation>
 <translation id="7537536606612762813">ግዴታ</translation>
 <translation id="7542995811387359312">ይህ ቅጽ ደህንነቱ የተጠበቀ ግንኙነት ስለማይጠቀም የክሬዲት ካርድ ራስ-መሙላት ተሰናክሏል።</translation>
 <translation id="7567204685887185387">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በተጭበረበረ ሁኔታ ተሰጥቶ ሊሆን ይችላል። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">የአገልጋዩ እውቅና ማረጋገጫ አንዳንድ ገደቦችን ይጥሳል።</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" />ን በጭራሽ አትተርጉም</translation>
 <translation id="7610193165460212391">እሴት ከክልል <ph name="VALUE" /> ውጪ ነው።</translation>
+<translation id="7637571805876720304">ክሬዲት ካርድ ከChromium ይወገድ?</translation>
 <translation id="7674629440242451245">አዲስ የሆኑ አሪፍ የChrome ባህሪያትን ይፈልጋሉ? በ chrome.com/dev ላይ ያለውን የdev ሰርጣችንን ይሞክሩት።</translation>
 <translation id="7752995774971033316">አይቀናበርም</translation>
 <translation id="7761701407923456692">የአገልጋይ እውቅና ማረጋገጫ ከዩ አር ኤሉ ጋር አይዛመድም።</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 90d1034..689db06 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">تاريخ الإصدار</translation>
 <translation id="1549470594296187301">‏يجب تمكين JavaScript لاستخدام هذه الميزة.</translation>
 <translation id="1559528461873125649">لا وجود لمثل هذا الملف أو الدليل</translation>
+<translation id="1629803312968146339">‏هل تريد من Chrome حفظ هذه البطاقة؟</translation>
 <translation id="1640180200866533862">سياسات المستخدم</translation>
 <translation id="1644184664548287040">تهيئة الشبكة غير صالحة ويتعذر استيرادها.</translation>
 <translation id="1655462015569774233">{1,plural, =1{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه أمس. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}zero{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # يوم. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}two{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ يومين (#). ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}few{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # أيام. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}many{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # يومًا. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}other{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ انتهت صلاحية شهادة أمانه منذ # يوم. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك. تم تعيين ساعة الكمبيوتر لديك حاليًا على <ph name="CURRENT_DATE" />. هل يبدو ذلك صحيحًا؟ إذا لم يكن الأمر كذلك، يجب تصحيح ساعة النظام لديك ثم تحديث هذه الصفحة.}}</translation>
 <translation id="168841957122794586">تحتوي شهادة الخادم على مفتاح تشفير ضعيف.</translation>
-<translation id="1693754753824026215">تعرض الصفحة في <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه من الغد. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}zero{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # يوم في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}two{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال يومين (#) في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}few{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # أيام في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}many{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # يومًا في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}other{هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ من المفترض أن تبدأ شهادة أمانه خلال # يوم في المستقبل. ربما يكون السبب في ذلك خطأ في التهيئة أو مهاجمًا يعترض اتصالك.}}</translation>
 <translation id="1710259589646384581">نظام التشغيل</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">نطاق السياسة غير متوافق.</translation>
 <translation id="4120075327926916474">‏هل تريد من Chrome حفظ معلومات بطاقة الائتمان لإكمال نماذج الويب؟</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">‏هل تريد من Chromium حفظ هذه البطاقة؟</translation>
 <translation id="4171400957073367226">توقيع تحقق سيئ</translation>
 <translation id="4196861286325780578">إ&amp;عادة النقل</translation>
 <translation id="4220128509585149162">الأعطال</translation>
 <translation id="4250680216510889253">لا</translation>
 <translation id="4258748452823770588">توقيع غير صالح</translation>
+<translation id="4268298190799576220">‏لم يتمكن Chromium من التحقق من بطاقتك في الوقت الحالي. يُرجى إعادة المحاولة في وقت لاحق.</translation>
 <translation id="4269787794583293679">(اسم المستخدم غير موجود)</translation>
 <translation id="4300246636397505754">اقتراحات الآباء</translation>
 <translation id="4325863107915753736">أخفق العثور على المقالة</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">فترة صلاحية شهادة الخادم طويلة جدًا.</translation>
 <translation id="6154808779448689242">لا يتطابق الرمز المميز لسياسة الإرجاع مع الرمز المميز الحالي</translation>
 <translation id="6165508094623778733">مزيد من المعلومات</translation>
+<translation id="6218753634732582820">‏هل تريد إزالة العنوان من Chromium؟</translation>
 <translation id="6259156558325130047">إعادة إ&amp;جراء الترتيب</translation>
 <translation id="6263376278284652872">إشعارات <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">الرمز البريدي</translation>
 <translation id="6337534724793800597">تصفية السياسات بحسب الاسم</translation>
+<translation id="6342069812937806050">الآن</translation>
 <translation id="6355080345576803305">إلغاء الجلسة العامة</translation>
 <translation id="6387478394221739770">‏إذا كنت مهتمًا بميزات Google الجديدة والرائعة، فيُمكنك تجربة القناة التجريبية على chrome.com/beta.</translation>
 <translation id="6445051938772793705">البلد</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685">بحث <ph name="ENGINE" /></translation>
 <translation id="6644283850729428850">تم تجاهل هذه السياسة.</translation>
 <translation id="6646897916597483132">‏أدخل رمز التحقق من البطاقة (CVC) المكون من أربعة أرقام من الجزء الأمامي من بطاقتك</translation>
+<translation id="6671697161687535275">‏هل تريد إزالة اقتراح النموذج من Chromium؟</translation>
 <translation id="674375294223700098">حدث خطأ غير معروف في شهادة الخادم.</translation>
 <translation id="6753269504797312559">قيمة السياسة</translation>
 <translation id="6831043979455480757">ترجمة</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">جهاز</translation>
 <translation id="6970216967273061347">المنطقة</translation>
 <translation id="6973656660372572881">‏تم تحديد كل من الخوادم الوكيلة الثابتة وعنوان URL للنص البرمجي pac.</translation>
-<translation id="6980028882292583085">تنبيه جافا سكريبت</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">لقد حاولت الوصول إلى <ph name="DOMAIN" />، ولكن الخادم قدم شهادة مدة صلاحيتها طويلة جدًا مما يجعلها غير جديرة بالثقة.</translation>
 <translation id="7087282848513945231">المقاطعة/الإقليم/المنطقة</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">مسار الملف الشخصي</translation>
 <translation id="7441627299479586546">موضوع السياسة غير صحيح</translation>
 <translation id="7485870689360869515">لم يتم العثور على بيانات.</translation>
-<translation id="7521387064766892559">جافا سكريبت</translation>
 <translation id="7537536606612762813">إلزامية</translation>
 <translation id="7542995811387359312">تم تعطيل الملء التلقائي لبطاقة الائتمان لأن هذا النموذج لا يستخدم اتصالاً آمنًا.</translation>
 <translation id="7567204685887185387">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان تم إصدارها عن طريق الاحتيال. وربما يكون سبب ذلك خطأ في التكوين أو مهاجمًا يعترض اتصالك.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">تنتهك شهادة الخادم القيود المفروضة على الاسم.</translation>
 <translation id="7600965453749440009">عدم الترجمة مطلقًا من اللغة <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">القيمة خارج النطاق <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">‏هل تريد إزالة بطاقة الائتمان من Chromium؟</translation>
 <translation id="7674629440242451245">‏إذا كنت مهتمًا بميزات Google الجديدة والرائعة، فيُمكنك تجربة قناة مطوري البرامج على chrome.com/dev.</translation>
 <translation id="7752995774971033316">غير مُدار</translation>
 <translation id="7761701407923456692">‏لا تتطابق شهادة الخادم مع عنوان URL.</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 0b19216..0aa5afc5 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Конфигурацията на мрежата е невалидна и не можа да се импортира.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е изтекъл вчера. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака. Понастоящем часовникът на компютъра ви показва <ph name="CURRENT_DATE" />. Това изглежда ли правилно? Ако не е, трябва да сверите системния часовник и след това да опресните страницата.}other{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е изтекъл преди # дни. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака. Понастоящем часовникът на компютъра ви показва <ph name="CURRENT_DATE" />. Това изглежда ли правилно? Ако не е, трябва да сверите системния часовник и след това да опресните страницата.}}</translation>
 <translation id="168841957122794586">Сертификатът на сървъра съдържа слаб криптографски ключ.</translation>
-<translation id="1693754753824026215">Страницата на адрес <ph name="SITE" /> показва:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е от утре. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака.}other{Сървърът не можа да докаже, че е <ph name="DOMAIN" />. Сертификатът му за сигурност е от # дни в бъдещето. Това може да се дължи на неправилно конфигуриране или на прехващане на връзката ви от извършител на атака.}}</translation>
 <translation id="1710259589646384581">ОС</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Отметки от <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Пощенски код</translation>
 <translation id="6337534724793800597">Филтриране на правилата по име</translation>
+<translation id="6342069812937806050">Току-що</translation>
 <translation id="6355080345576803305">Принудително зададено поради обществена сесия</translation>
 <translation id="6387478394221739770">Търсите интересни нови функции на Chrome? Изпробвайте бета канала на адрес chrome.com/beta.</translation>
 <translation id="6445051938772793705">Държава</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Устройство</translation>
 <translation id="6970216967273061347">Окръг</translation>
 <translation id="6973656660372572881">Посочени са както фиксирани прокси сървъри, така и URL адрес на скрипт във формат .pac.</translation>
-<translation id="6980028882292583085">Уведомление за JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Опитахте да се свържете с/ъс <ph name="DOMAIN" />, но сървърът предостави сертификат, чийто период на валидност е твърде дълъг, за да е надежден.</translation>
 <translation id="7087282848513945231">Окръг</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Път на потребителския профил</translation>
 <translation id="7441627299479586546">Грешен предмет на правилото</translation>
 <translation id="7485870689360869515">Няма намерени данни.</translation>
-<translation id="7521387064766892559">Javascript</translation>
 <translation id="7537536606612762813">Задължително</translation>
 <translation id="7542995811387359312">Автоматичното попълване на кредитната карта е деактивирано, защото този формуляр не използва защитена връзка.</translation>
 <translation id="7567204685887185387">Сървърът не можа да докаже, че е <ph name="DOMAIN" />; възможно е сертификатът му за сигурност да е издаден измамнически. Това може да се дължи на неправилно конфигуриране или на прихващане на връзката ви от атакуващ.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index cb0d436..5d8dba6 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">নেটওয়ার্ক কনফিগারেশনটি অবৈধ এবং আমদানি করা যায়নি৷</translation>
 <translation id="1655462015569774233">{1,plural, =1{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি গতকাল মেয়াদোত্তীর্ণ হয়েছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে। আপনার কম্পিউটারের ঘড়ি বর্তমানে <ph name="CURRENT_DATE" /> এ সেট করা আছে। এটি কি ঠিক আছে বলে মনে হচ্ছে? যদি তা না হয়, তাহলে আপনার সিস্টেম ঘড়িটি ঠিক করা উচিত হবে এবং তারপর এই পৃষ্ঠাটি রিফ্রেশ করা উচিত।}one{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি # দিন আগে মেয়াদোত্তীর্ণ হয়েছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে। আপনার কম্পিউটারের ঘড়ি বর্তমানে <ph name="CURRENT_DATE" /> এ সেট করা আছে। এটি কি ঠিক আছে বলে মনে হচ্ছে? যদি তা না হয়, তাহলে আপনার সিস্টেম ঘড়িটি ঠিক করা উচিত হবে এবং তারপর এই পৃষ্ঠাটি রিফ্রেশ করা উচিত।}other{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি # দিন আগে মেয়াদোত্তীর্ণ হয়েছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে। আপনার কম্পিউটারের ঘড়ি বর্তমানে <ph name="CURRENT_DATE" /> এ সেট করা আছে। এটি কি ঠিক আছে বলে মনে হচ্ছে? যদি তা না হয়, তাহলে আপনার সিস্টেম ঘড়িটি ঠিক করা উচিত হবে এবং তারপর এই পৃষ্ঠাটি রিফ্রেশ করা উচিত।}}</translation>
 <translation id="168841957122794586">সার্ভার শংসাপত্রে একটি দুর্বল কপিরাইট কী আছে৷</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> এর পৃষ্ঠাটি জানাচ্ছে:</translation>
 <translation id="1706954506755087368">{1,plural, =1{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি আগামীকালের বলে মনে হচ্ছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে।}one{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি আগামী # দিন পরের বলে মনে হচ্ছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে।}other{এই সার্ভার যে <ph name="DOMAIN" /> তা এটি প্রমাণ করতে পারেনি; এর নিরাপত্তা শংসাপত্রটি আগামী # দিন পরের বলে মনে হচ্ছে। কোনো ভুল কনফিগারেশনের কারণে অথবা আপনার সংযোগে বাধাপ্রদানকারী কোনো আক্রমণকারীর কারণে এমনটি হতে পারে।}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -228,6 +227,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> বুকমার্কগুলি</translation>
 <translation id="6282194474023008486">পোস্টাল কোড</translation>
 <translation id="6337534724793800597">নাম অনুসারে ফিল্টারগুলি বাছাই করুন</translation>
+<translation id="6342069812937806050">এখনই</translation>
 <translation id="6355080345576803305">সর্বজনীন অধিবেশন ওভাররাইড</translation>
 <translation id="6387478394221739770">Chrome এর নতুন দুর্দান্ত বৈশিষ্ট্যগুলিতে আগ্রহী? chrome.com/beta এ আমাদের বিটা চ্যানেল ব্যবহার করে দেখুন৷</translation>
 <translation id="6445051938772793705">দেশ</translation>
@@ -253,7 +253,6 @@
 <translation id="6965978654500191972">ডিভাইস</translation>
 <translation id="6970216967273061347">জেলা</translation>
 <translation id="6973656660372572881">স্থির প্রক্সি সার্ভার এবং .pac স্ক্রিপ্ট URL-এর উভয়ই নির্দিষ্ট আছে৷</translation>
-<translation id="6980028882292583085">Javascript সতর্কতা</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">আমি <ph name="DOMAIN" />-এ সংযোগ করার চেষ্টা করেছেন, কিন্তু সার্ভার একটি শংসাপত্র উপস্থাপন করেছে যার বৈধতার সময়সীমা এত বেশী যে বিশ্বাসযোগ্য নয়।</translation>
 <translation id="7087282848513945231">দেশ</translation>
@@ -276,7 +275,6 @@
 <translation id="7419106976560586862">প্রোফাইল পথ</translation>
 <translation id="7441627299479586546">ভুল বিষয় বিশিষ্ট নীতি</translation>
 <translation id="7485870689360869515">কোনো ডেটা পাওয়া যায়নি৷</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">বাধ্যতামূলক</translation>
 <translation id="7542995811387359312">স্বয়ংক্রিয় ক্রেডিট কার্ড পূরণটি অক্ষম রয়েছে কারণ এই ফর্মটি কোনও সুরক্ষিত সংযোগ ব্যবহার করে না৷</translation>
 <translation id="7567204685887185387">এই সার্ভার প্রমাণ করতে পারেনি যে এটি <ph name="DOMAIN" />; এর নিরাপত্তা শংসাপত্র প্রতারণাপূর্ণভাবে ইস্যু করা হয়ে থাকতে পারে। কোনো ভুল কনফিগারেশনের কারণে অথবা কোনো আক্রমণকারী আপনার সংযোগ মাঝপথে আটকে দিচ্ছে বলে এমনটা হতে পারে।</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 6fbfa8a..f053807 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">La configuració de la xarxa no és vàlida i no s'ha pogut importar.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" /> perquè el seu certificat de seguretat va caducar ahir. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió. Actualment, el rellotge del vostre ordinador està configurat amb la data <ph name="CURRENT_DATE" />. És correcta? Si no ho és, corregiu el rellotge del sistema i, a continuació, actualitzeu aquesta pàgina.}other{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" /> perquè el seu certificat va caducar fa # dies. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió. Actualment, el rellotge del vostre ordinador està configurat amb la data <ph name="CURRENT_DATE" />. És correcta? Si no ho és, corregiu el rellotge del sistema i, a continuació, actualitzeu aquesta pàgina.}}</translation>
 <translation id="168841957122794586">El certificat de servidor conté una clau criptogràfica dèbil.</translation>
-<translation id="1693754753824026215">La pàgina de <ph name="SITE" /> diu:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" /> perquè, suposadament, el seu certificat de seguretat té la data de demà. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.}other{Aquest servidor no ha pogut demostrar que sigui <ph name="DOMAIN" />; perquè, suposadament, el seu certificat de seguretat té una data que és d'aquí a # dies. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.}}</translation>
 <translation id="1710259589646384581">SO</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Adreces d'interès de <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Codi postal</translation>
 <translation id="6337534724793800597">Filtra les polítiques pel nom</translation>
+<translation id="6342069812937806050">Ara mateix</translation>
 <translation id="6355080345576803305">Substitueix en sessions públiques</translation>
 <translation id="6387478394221739770">Esteu interessat en les funcions de Chrome noves i interessants? Proveu el nostre canal beta a la pàgina chrome.com/beta.</translation>
 <translation id="6445051938772793705">País</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispositiu</translation>
 <translation id="6970216967273061347">Districte</translation>
 <translation id="6973656660372572881">S'especifiquen tant els servidors intermediaris fixos com un URL d'script .pac.</translation>
-<translation id="6980028882292583085">Alerta de JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Heu provat de connectar-vos a <ph name="DOMAIN" />, però el servidor ha presentat un certificat amb un període de validesa massa gran per poder confiar-hi.</translation>
 <translation id="7087282848513945231">Comptat</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Camí del perfil</translation>
 <translation id="7441627299479586546">Usuari de la política incorrecte</translation>
 <translation id="7485870689360869515">No s'han trobat dades.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatòria</translation>
 <translation id="7542995811387359312">L'emplenament automàtic de targetes de crèdit està desactivat perquè el formulari no utilitza una connexió segura.</translation>
 <translation id="7567204685887185387">Aquest servidor no ha pogut comprovar que sigui <ph name="DOMAIN" /> perquè és possible que el seu certificat de seguretat s'hagi emès de manera fraudulenta. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index c2cd75c8..ddf85df 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Konfigurace sítě je neplatná a nelze ji importovat.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu včera vypršela. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste nastavit správné hodiny systému a poté tuto stránku načíst znovu.}few{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu vypršela před # dny. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste čas v počítači opravit a poté tuto stránku načíst znovu.}many{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu vypršela před # dnem. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste nastavit správné hodiny systému a poté tuto stránku načíst znovu.}other{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Platnost jeho bezpečnostního certifikátu vypršela před # dny. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník. Hodiny ve vašem počítači jsou aktuálně nastaveny na <ph name="CURRENT_DATE" />. Je to správně? Pokud ne, měli byste nastavit správné hodiny systému a poté tuto stránku načíst znovu.}}</translation>
 <translation id="168841957122794586">Certifikát serveru obsahuje slabý kryptografický klíč.</translation>
-<translation id="1693754753824026215">Stránka na webu <ph name="SITE" /> říká:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je zítra. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}few{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je až za # dny. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}many{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je až za # dne. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}other{Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Uvedené datum vystavení jeho bezpečnostního certifikátu je až za # dní. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.}}</translation>
 <translation id="1710259589646384581">Operační systém</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Záložky webu <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">PSČ</translation>
 <translation id="6337534724793800597">Filtrovat zásady podle názvu</translation>
+<translation id="6342069812937806050">Právě teď</translation>
 <translation id="6355080345576803305">Přepsání veřejné relace</translation>
 <translation id="6387478394221739770">Zajímají vás nové funkce Chromu? Vyzkoušejte kanál beta na adrese chrome.com/beta.</translation>
 <translation id="6445051938772793705">Země</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Zařízení</translation>
 <translation id="6970216967273061347">Obvod</translation>
 <translation id="6973656660372572881">Určeny jsou pevně dané servery proxy i adresa URL skriptu PAC.</translation>
-<translation id="6980028882292583085">JavaScript – výstraha</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Pokusili jste se připojit k doméně <ph name="DOMAIN" />, ale server předložil certifikát, který má příliš dlouhé období platnosti a je proto nedůvěryhodný.</translation>
 <translation id="7087282848513945231">Obvod</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Cesta k profilu</translation>
 <translation id="7441627299479586546">Chybný předmět zásady</translation>
 <translation id="7485870689360869515">Nebyla nalezena žádná data.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Povinná</translation>
 <translation id="7542995811387359312">Automatické vyplňování údajů platební karty je deaktivováno, protože tento formulář nepoužívá zabezpečené připojení.</translation>
 <translation id="7567204685887185387">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Jeho bezpečnostní certifikát byl zřejmě vydán podvodně. Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index b750192c..af4d2c8 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Netværkskonfigurationen er ugyldig og kunne ikke importeres.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat udløb i går. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse. Computerens ur er angivet til <ph name="CURRENT_DATE" />. Er det korrekt? Hvis ikke, skal du rette systemets ur og derefter opdatere denne side.}one{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat udløb for # dag siden. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse. Computerens ur er angivet til <ph name="CURRENT_DATE" />. Er det korrekt? Hvis ikke, skal du rette systemets ur og derefter opdatere denne side.}other{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat udløb for # dage siden. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse. Computerens ur er angivet til <ph name="CURRENT_DATE" />. Er det korrekt? Hvis ikke, skal du rette systemets ur og derefter opdatere denne side.}}</translation>
 <translation id="168841957122794586">Servercertifikatet indeholder en svag kryptografisk nøgle.</translation>
-<translation id="1693754753824026215">Siden på <ph name="SITE" /> siger:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat tilsyneladende først gælder fra i morgen. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.}one{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat tilsyneladende først gælder fra om # dag. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.}other{Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da dens sikkerhedscertifikat tilsyneladende først gælder fra om # dage. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" />-bogmærker</translation>
 <translation id="6282194474023008486">Postnummer</translation>
 <translation id="6337534724793800597">Filtrer politikker efter navn</translation>
+<translation id="6342069812937806050">Lige nu</translation>
 <translation id="6355080345576803305">Tilsidesættelse af offentlig session</translation>
 <translation id="6387478394221739770">Er du interesseret i smarte nye Chrome-funktioner? Prøv vores betakanal på chrome.com/beta.</translation>
 <translation id="6445051938772793705">Land</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Enhed</translation>
 <translation id="6970216967273061347">Distrikt</translation>
 <translation id="6973656660372572881">Både faste proxyservere og en webadresse for .pac-script angives.</translation>
-<translation id="6980028882292583085">JavaScript-advarsel</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Du forsøgte at gå til <ph name="DOMAIN" />, men serveren præsenterede et certifikat, hvis gyldighedsperiode er for lang til at være pålidelig.</translation>
 <translation id="7087282848513945231">Amt/region</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profilsti</translation>
 <translation id="7441627299479586546">Forkert emne for politik</translation>
 <translation id="7485870689360869515">Der blev ikke fundet nogen data.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatorisk</translation>
 <translation id="7542995811387359312">Automatisk udfyldning af kreditkort er deaktiveret, fordi formularen ikke bruger en sikker forbindelse.</translation>
 <translation id="7567204685887185387">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da sikkerhedscertifikatet er udstedt på ulovlig vis. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index b995b57..e2002c0 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Die Netzwerkkonfiguration ist ungültig und konnte nicht importiert werden.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat ist gestern abgelaufen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt. Die Uhr Ihres Computers ist derzeit auf <ph name="CURRENT_DATE" /> eingestellt. Ist das korrekt? Falls nicht, stellen Sie die Uhr Ihres Systems richtig ein und aktualisieren Sie anschließend diese Seite.}other{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat ist vor # Tagen abgelaufen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt. Die Uhr Ihres Computers ist derzeit auf <ph name="CURRENT_DATE" /> eingestellt. Ist das korrekt? Falls nicht, stellen Sie die Uhr Ihres Systems richtig ein und aktualisieren Sie anschließend diese Seite.}}</translation>
 <translation id="168841957122794586">Das Serverzertifikat weist einen schwachen kryptografischen Schlüssel auf.</translation>
-<translation id="1693754753824026215">Die Seite auf <ph name="SITE" /> meldet:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat gilt vermutlich erst ab morgen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.}other{Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat gilt vermutlich erst in # Tagen. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.}}</translation>
 <translation id="1710259589646384581">Betriebssystem</translation>
 <translation id="1734864079702812349">American Express</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" />-Lesezeichen</translation>
 <translation id="6282194474023008486">Postleitzahl</translation>
 <translation id="6337534724793800597">Richtlinien nach Name filtern</translation>
+<translation id="6342069812937806050">Abgeschlossen</translation>
 <translation id="6355080345576803305">Überschreibung öffentlicher Sitzung</translation>
 <translation id="6387478394221739770">Interessiert an coolen neuen Chrome-Funktionen? Testen Sie unsere Betaversion unter chrome.com/beta.</translation>
 <translation id="6445051938772793705">Land</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Gerät</translation>
 <translation id="6970216967273061347">Bezirk</translation>
 <translation id="6973656660372572881">Sowohl feste Proxyserver als auch eine PAC-Skript-URL sind festgelegt.</translation>
-<translation id="6980028882292583085">JavaScript-Warnmeldung</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Sie haben versucht, <ph name="DOMAIN" /> zu erreichen. Der Server hat jedoch ein Zertifikat präsentiert, dessen Gültigkeitsdauer zu lang ist, um vertrauenswürdig zu sein.</translation>
 <translation id="7087282848513945231">Landkreis</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profilpfad</translation>
 <translation id="7441627299479586546">Falsche(r) Nutzername/Domain der Richtlinie</translation>
 <translation id="7485870689360869515">Keine Daten gefunden</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Verbindlich</translation>
 <translation id="7542995811387359312">Die Funktion zur automatischen Ausfüllung der Kreditkartendaten ist deaktiviert, da dieses Formular keine sichere Verbindung nutzt.</translation>
 <translation id="7567204685887185387">Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat wurde möglicherweise in betrügerischer Absicht ausgegeben. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index f910e68..f0ac5cd6 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Ημερομηνία κατασκευής</translation>
 <translation id="1549470594296187301">Θα πρέπει να ενεργοποιηθεί η JavaScript για τη χρήση αυτής της λειτουργίας.</translation>
 <translation id="1559528461873125649">Δεν υπάρχει τέτοιο αρχείο ή κατάλογος</translation>
+<translation id="1629803312968146339">Θέλετε το Chrome να αποθηκεύσει αυτήν την κάρτα;</translation>
 <translation id="1640180200866533862">Πολιτικές χρηστών</translation>
 <translation id="1644184664548287040">Η διαμόρφωση δικτύου είναι μη έγκυρη και δεν ήταν δυνατή η εισαγωγή της.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του έληξε χθες. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας. Το ρολόι του υπολογιστή σας αυτήν τη στιγμή είναι ρυθμισμένο στην ημερομηνία <ph name="CURRENT_DATE" />. Είναι σωστή αυτή η ρύθμιση; Εάν όχι, θα πρέπει να διορθώσετε το ρολόι του συστήματός σας και έπειτα να ανανεώσετε αυτήν τη σελίδα.}other{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του έληξε πριν από # ημέρες. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας. Το ρολόι του υπολογιστή σας αυτήν τη στιγμή είναι ρυθμισμένο στην ημερομηνία <ph name="CURRENT_DATE" />. Είναι σωστή αυτή η ρύθμιση; Εάν όχι, θα πρέπει να διορθώσετε το ρολόι του συστήματός σας και έπειτα να ανανεώσετε αυτήν τη σελίδα.}}</translation>
 <translation id="168841957122794586">Το πιστοποιητικό διακομιστή περιέχει ένα αδύναμο κρυπτογραφικό κλειδί.</translation>
-<translation id="1693754753824026215">Ειδοποίηση από τη σελίδα στη διεύθυνση <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Η ημερομηνία του πιστοποιητικού ασφαλείας του υποτίθεται ότι είναι αυριανή. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας.}other{Αυτός ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι το <ph name="DOMAIN" />. Η ημερομηνία του πιστοποιητικού ασφαλείας του υποτίθεται ότι είναι από # ημέρες μετά. Αυτό μπορεί να οφείλεται σε εσφαλμένη ρύθμιση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Το εύρος της πολιτικής δεν υποστηρίζεται.</translation>
 <translation id="4120075327926916474">Θέλετε το Chrome να αποθηκεύσει τις πληροφορίες αυτής της πιστωτικής κάρτας για τη συμπλήρωση φορμών ιστού;</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Θέλετε το Chromium να αποθηκεύσει αυτήν την κάρτα;</translation>
 <translation id="4171400957073367226">Εσφαλμένη υπογραφή επαλήθευσης</translation>
 <translation id="4196861286325780578">&amp;Επανάληψη μετακίνησης</translation>
 <translation id="4220128509585149162">Απότομες διακοπές λειτουργίας</translation>
 <translation id="4250680216510889253">Όχι</translation>
 <translation id="4258748452823770588">Εσφαλμένη υπογραφή</translation>
+<translation id="4268298190799576220">Δεν ήταν δυνατή η επαλήθευση της κάρτας σας από το Chromium αυτήν τη στιγμή. Δοκιμάστε ξανά αργότερα.</translation>
 <translation id="4269787794583293679">(Χωρίς όνομα χρήστη)</translation>
 <translation id="4300246636397505754">Γονικές προτάσεις</translation>
 <translation id="4325863107915753736">Αποτυχία εύρεσης άρθρου</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">Το πιστοποιητικό του διακομιστή έχει πολύ μεγάλη περίοδο εγκυρότητας.</translation>
 <translation id="6154808779448689242">Το εμφανιζόμενο διακριτικό πολιτικής δεν αντιστοιχεί με το τρέχον διακριτικό</translation>
 <translation id="6165508094623778733">Μάθετε περισσότερα</translation>
+<translation id="6218753634732582820">Να καταργηθεί η διεύθυνση από το Chromium;</translation>
 <translation id="6259156558325130047">&amp;Επανάληψη αναδιάταξης</translation>
 <translation id="6263376278284652872">Σελιδοδείκτες <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Ταχυδρομικός κώδικας</translation>
 <translation id="6337534724793800597">Φιλτράρισμα πολιτικών με βάση το όνομα</translation>
+<translation id="6342069812937806050">Πριν λίγο</translation>
 <translation id="6355080345576803305">Παράκαμψη δημόσιας περιόδου σύνδεσης</translation>
 <translation id="6387478394221739770">Θέλετε να ενημερώνεστε για τις συναρπαστικές νέες δυνατότητες του Chrome; Επισκεφτείτε το κανάλι beta στη διεύθυνση chrome.com/beta.</translation>
 <translation id="6445051938772793705">Χώρα</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685">Αναζήτηση <ph name="ENGINE" /></translation>
 <translation id="6644283850729428850">Αυτή η πολιτική έχει αποσυρθεί.</translation>
 <translation id="6646897916597483132">Εισαγάγετε τον τετραψήφιο κωδικό CVC από το μπροστινό μέρος της κάρτας σας</translation>
+<translation id="6671697161687535275">Να καταργηθεί η πρόταση φόρμας από το Chromium;</translation>
 <translation id="674375294223700098">Άγνωστο σφάλμα πιστοποιητικού διακομιστή</translation>
 <translation id="6753269504797312559">Τιμή πολιτικής</translation>
 <translation id="6831043979455480757">Μετάφραση</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Συσκευή</translation>
 <translation id="6970216967273061347">Περιοχή</translation>
 <translation id="6973656660372572881">Καθορίζονται τόσο οι σταθεροί διακομιστές μεσολάβησης όσο και μια διεύθυνση URL σεναρίου .pac.</translation>
-<translation id="6980028882292583085">Ειδοποίηση JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Επιχειρήσατε να μεταβείτε στο <ph name="DOMAIN" />, αλλά ο διακομιστής παρουσίασε ένα πιστοποιητικό με περίοδο εγκυρότητας η οποία είναι πολύ μεγάλη για να θεωρηθεί αξιόπιστη.</translation>
 <translation id="7087282848513945231">Περιφέρεια</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Διαδρομή προφίλ</translation>
 <translation id="7441627299479586546">Εσφαλμένο θέμα πολιτικής</translation>
 <translation id="7485870689360869515">Δεν βρέθηκαν δεδομένα</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Υποχρεωτική</translation>
 <translation id="7542995811387359312">Η αυτόματη συμπλήρωση πιστωτικής κάρτας έχει απενεργοποιηθεί, επειδή αυτή η φόρμα δεν χρησιμοποιεί ασφαλή σύνδεση.</translation>
 <translation id="7567204685887185387">Ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του μπορεί να εκδόθηκε παράνομα. Αυτό μπορεί να οφείλεται σε λανθασμένη ρύθμιση ή σε κάποιον τρίτο που επιτίθεται στη σύνδεσή σας.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Το πιστοποιητικό του διακομιστή παραβαίνει τους περιορισμούς ονόματος.</translation>
 <translation id="7600965453749440009">Να μην γίνεται ποτέ μετάφραση από <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Η τιμή είναι εκτός του εύρους τιμών <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">Να καταργηθεί η πιστωτική κάρτα από το Chromium;</translation>
 <translation id="7674629440242451245">Θέλετε να ενημερώνεστε για τις συναρπαστικές νέες δυνατότητες του Chrome; Επισκεφτείτε το κανάλι προγραμματιστών στη διεύθυνση chrome.com/dev.</translation>
 <translation id="7752995774971033316">Χωρίς διαχείριση</translation>
 <translation id="7761701407923456692">Το πιστοποιητικό του διακομιστή δεν συμφωνεί με τη διεύθυνση URL.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index e52b8063..65ecc02 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Build Date</translation>
 <translation id="1549470594296187301">JavaScript must be enabled to use this feature.</translation>
 <translation id="1559528461873125649">No such file or directory</translation>
+<translation id="1629803312968146339">Do you want Chrome to save this card?</translation>
 <translation id="1640180200866533862">User policies</translation>
 <translation id="1644184664548287040">The network configuration is invalid and couldn't be imported.</translation>
 <translation id="1655462015569774233">{1,plural, =1{This server could not prove that it is <ph name="DOMAIN" />; its security certificate expired yesterday. This may be caused by a misconfiguration or an attacker intercepting your connection. Your computer's clock is currently set to <ph name="CURRENT_DATE" />. Does that look right? If not, you should correct your system's clock and then refresh this page.}other{This server could not prove that it is <ph name="DOMAIN" />; its security certificate expired # days ago. This may be caused by a misconfiguration or an attacker intercepting your connection. Your computer's clock is currently set to <ph name="CURRENT_DATE" />. Does that look right? If not, you should correct your system's clock and then refresh this page.}}</translation>
 <translation id="168841957122794586">The server certificate contains a weak cryptographic key.</translation>
-<translation id="1693754753824026215">The page at <ph name="SITE" /> says:</translation>
 <translation id="1706954506755087368">{1,plural, =1{This server could not prove that it is <ph name="DOMAIN" />; its security certificate is supposedly from tomorrow. This may be caused by a misconfiguration or an attacker intercepting your connection.}other{This server could not prove that it is <ph name="DOMAIN" />; its security certificate is supposedly from # days in the future. This may be caused by a misconfiguration or an attacker intercepting your connection.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Policy scope is not supported.</translation>
 <translation id="4120075327926916474">Do you want Chrome to save this credit card information for completing web forms?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Do you want Chromium to save this card?</translation>
 <translation id="4171400957073367226">Bad verification signature</translation>
 <translation id="4196861286325780578">&amp;Redo move</translation>
 <translation id="4220128509585149162">Crashes</translation>
 <translation id="4250680216510889253">No</translation>
 <translation id="4258748452823770588">Bad signature</translation>
+<translation id="4268298190799576220">Chromium was unable to verify your card at this time. Please try again later.</translation>
 <translation id="4269787794583293679">(No username)</translation>
 <translation id="4300246636397505754">Parent suggestions</translation>
 <translation id="4325863107915753736">Failed to find article</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">The server certificate has a validity period that is too long.</translation>
 <translation id="6154808779448689242">Returned policy token doesn't match current token</translation>
 <translation id="6165508094623778733">Learn more</translation>
+<translation id="6218753634732582820">Remove address from Chromium?</translation>
 <translation id="6259156558325130047">&amp;Redo Reorder</translation>
 <translation id="6263376278284652872"><ph name="DOMAIN" /> bookmarks</translation>
 <translation id="6282194474023008486">Postcode</translation>
 <translation id="6337534724793800597">Filter policies by name</translation>
+<translation id="6342069812937806050">Just now</translation>
 <translation id="6355080345576803305">Public session override</translation>
 <translation id="6387478394221739770">Interested in cool new Chrome features? Try our beta channel at chrome.com/beta.</translation>
 <translation id="6445051938772793705">Country</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Search</translation>
 <translation id="6644283850729428850">This policy has been deprecated.</translation>
 <translation id="6646897916597483132">Enter the 4-digit CVC from the front of your card</translation>
+<translation id="6671697161687535275">Remove form suggestion from Chromium?</translation>
 <translation id="674375294223700098">Unknown server certificate error.</translation>
 <translation id="6753269504797312559">Policy Value</translation>
 <translation id="6831043979455480757">Translate</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Device</translation>
 <translation id="6970216967273061347">District</translation>
 <translation id="6973656660372572881">Both fixed proxy servers and a .pac script URL are specified.</translation>
-<translation id="6980028882292583085">JavaScript Alert</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">You attempted to reach <ph name="DOMAIN" />, but the server presented a certificate whose validity period is too long to be trustworthy.</translation>
 <translation id="7087282848513945231">County</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Profile Path</translation>
 <translation id="7441627299479586546">Wrong policy subject</translation>
 <translation id="7485870689360869515">No data found.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Mandatory</translation>
 <translation id="7542995811387359312">Automatic credit card filling is disabled because this form does not use a secure connection.</translation>
 <translation id="7567204685887185387">This server could not prove that it is <ph name="DOMAIN" />; its security certificate might have been issued fraudulently. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Server's certificate violates name constraints.</translation>
 <translation id="7600965453749440009">Never translate <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Value is out of range <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">Remove credit card from Chromium?</translation>
 <translation id="7674629440242451245">Interested in cool new Chrome features? Try our dev channel at chrome.com/dev.</translation>
 <translation id="7752995774971033316">Unmanaged</translation>
 <translation id="7761701407923456692">Server's certificate does not match the URL.</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 95c2df1..ad202c44 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">La configuración de red no es válida y no se pudo importar.</translation>
 <translation id="1655462015569774233">{1,plural, =1{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; el certificado de seguridad venció ayer. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión. Actualmente, el reloj de la computadora está configurado en la siguiente fecha: <ph name="CURRENT_DATE" />. ¿Es correcto? De no ser así, corrige el reloj del sistema y, a continuación, actualiza la página.}other{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; el certificado de seguridad venció hace # días. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión. Actualmente, el reloj de la computadora está configurado en la siguiente fecha: <ph name="CURRENT_DATE" />. ¿Es correcto? De no ser así, corrige el reloj del sistema y, a continuación, actualiza la página.}}</translation>
 <translation id="168841957122794586">El certificado del servidor contiene una clave criptográfica no segura.</translation>
-<translation id="1693754753824026215">La página en <ph name="SITE" /> dice:</translation>
 <translation id="1706954506755087368">{1,plural, =1{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; supuestamente, el certificado de seguridad entra en vigencia mañana. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión.}other{El servidor no logró comprobar si el dominio es <ph name="DOMAIN" />; supuestamente, el certificado de seguridad entra en vigencia en # días. Es posible que esto se deba a una configuración incorrecta o a que un atacante haya interceptado la conexión.}}</translation>
 <translation id="1710259589646384581">SO</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Marcadores de <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Código postal</translation>
 <translation id="6337534724793800597">Filtrar políticas por nombre</translation>
+<translation id="6342069812937806050">Recién</translation>
 <translation id="6355080345576803305">Anulación de sesión pública</translation>
 <translation id="6387478394221739770">Si estás interesado en probar nuevas e interesantes funciones de Chrome, visita nuestro canal beta en chrome.com/beta.</translation>
 <translation id="6445051938772793705">País</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Se especifican servidores proxy fijos y URL de secuencias de comandos .pac.</translation>
-<translation id="6980028882292583085">Alerta de Javascript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Intentaste acceder a <ph name="DOMAIN" />, pero el certificado de servidor tenía un período de validez demasiado extenso para ser fiable.</translation>
 <translation id="7087282848513945231">Condado</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Ruta del perfil</translation>
 <translation id="7441627299479586546">Nombre de usuario o dominio de política incorrecto</translation>
 <translation id="7485870689360869515">No se encontró ningún dato.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatoria</translation>
 <translation id="7542995811387359312">El rellenado automático de la tarjeta de crédito se inhabilitó porque este formulario no usa una conexión segura.</translation>
 <translation id="7567204685887185387">Este servidor no pudo probar que su dominio es <ph name="DOMAIN" />; el certificado de seguridad podría haberse emitido de forma fraudulenta. Es posible que esto se deba a una configuración incorrecta o a que un atacante interceptó la conexión.</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 0e3a96f..6cd6429 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">La configuración de red no es válida y no se ha podido importar.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; su certificado de seguridad caducó ayer. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión. El reloj de tu ordenador está establecido actualmente en las <ph name="CURRENT_DATE" />. ¿Es correcto? Si no lo es, corrige el reloj del sistema y, a continuación, actualiza esta página.}other{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; su certificado de seguridad caducó hace # días. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión. El reloj de tu ordenador está establecido actualmente en las <ph name="CURRENT_DATE" />. ¿Es correcto? Si no lo es, corrige el reloj del sistema y, a continuación, actualiza esta página.}}</translation>
 <translation id="168841957122794586">El certificado del servidor contiene una clave criptográfica no segura.</translation>
-<translation id="1693754753824026215">Mensaje de la página <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; supuestamente, su certificado de seguridad es válido a partir de mañana. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión.}other{Este servidor no ha podido demostrar que es <ph name="DOMAIN" />; supuestamente, su certificado de seguridad es válido dentro de # días. Este problema puede deberse a una configuración incorrecta o a que un atacante ha interceptado la conexión.}}</translation>
 <translation id="1710259589646384581">Sistema operativo</translation>
 <translation id="1734864079702812349">American Express</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Marcadores de <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Código postal</translation>
 <translation id="6337534724793800597">Filtrar políticas por nombre</translation>
+<translation id="6342069812937806050">Ahora</translation>
 <translation id="6355080345576803305">Anulación de sesión pública</translation>
 <translation id="6387478394221739770">Si estás interesado en probar nuevas e interesantes funciones de Chrome, prueba nuestro canal beta en la página chrome.com/beta.</translation>
 <translation id="6445051938772793705">País</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Se especifican tanto servidores proxy fijos como una URL de secuencia de comandos .pac.</translation>
-<translation id="6980028882292583085">Alerta de JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado cuyo período de validez es demasiado largo para que se considere de confianza.</translation>
 <translation id="7087282848513945231">Condado</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Ruta del perfil</translation>
 <translation id="7441627299479586546">Asunto de política incorrecto</translation>
 <translation id="7485870689360869515">No se han encontrado datos.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatoria</translation>
 <translation id="7542995811387359312">La opción de autocompletado de la tarjeta de crédito está inhabilitada porque este formulario no utiliza una conexión segura.</translation>
 <translation id="7567204685887185387">Este servidor no ha podido probar que su dominio es <ph name="DOMAIN" />, su certificado de seguridad podría haberse emitido de forma fraudulenta. El problema puede deberse a una configuración incorrecta o a que un atacante haya interceptado la conexión.</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 3540b5bb..5402bdb 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Võrgu seadistus on sobimatu ja seda ei saa importida.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat aegus eile. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja. Teie arvuti kell on praegu seatud kuupäevale <ph name="CURRENT_DATE" />. Kas see on õige? Kui ei ole, seadke süsteemi kell õigeks ja värskendage lehte.}other{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat aegus # päeva tagasi. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja. Teie arvuti kell on praegu seatud kuupäevale <ph name="CURRENT_DATE" />. Kas see on õige? Kui ei ole, seadke süsteemi kell õigeks ja värskendage lehte.}}</translation>
 <translation id="168841957122794586">Serveri sertifikaat sisaldab nõrka krüptograafilist võtit.</translation>
-<translation id="1693754753824026215">Teade veebilehelt aadressil <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat hakkab väidetavalt kehtima homme. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja.}other{Server ei suutnud tõestada, et tegemist on domeeniga <ph name="DOMAIN" />, selle turvasertifikaat hakkab väidetavalt kehtima # päeva pärast. Selle põhjuseks võib olla vale seadistus või teie ühendust segav ründaja.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Domeeni <ph name="DOMAIN" /> järjehoidjad</translation>
 <translation id="6282194474023008486">Sihtnumber</translation>
 <translation id="6337534724793800597">Reeglite filtreerimine nime järgi</translation>
+<translation id="6342069812937806050">Äsja</translation>
 <translation id="6355080345576803305">Avaliku seansi alistamine</translation>
 <translation id="6387478394221739770">Kas olete huvitatud Chrome'i uutest lahedatest funktsioonidest? Proovige meie beetakanalit aadressil chrome.com/beta.</translation>
 <translation id="6445051938772793705">Riik</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Seade</translation>
 <translation id="6970216967273061347">Ringkond</translation>
 <translation id="6973656660372572881">Määratud on nii fikseeritud puhverserverid kui ka pac-skriptiga URL.</translation>
-<translation id="6980028882292583085">JavaScripti märguanne</translation>
 <translation id="7012363358306927923">Hiina UnionPay</translation>
 <translation id="7050187094878475250">Üritasite jõuda domeenile <ph name="DOMAIN" />, kuid server esitas sertifikaadi, mille kehtivusaeg on liiga pikk, et olla usaldusväärne.</translation>
 <translation id="7087282848513945231">Maakond</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profiili tee</translation>
 <translation id="7441627299479586546">Reegli objekt on vale</translation>
 <translation id="7485870689360869515">Andmeid ei leitud.</translation>
-<translation id="7521387064766892559">Javascript</translation>
 <translation id="7537536606612762813">Kohustuslik</translation>
 <translation id="7542995811387359312">Automaatne krediitkaardi täide on keelatud, sest see vorm ei kasuta turvalist ühendust.</translation>
 <translation id="7567204685887185387">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, selle turvasertifikaat võib olla väljastatud pettuse teel. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index ad79985..2d79d5d6 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">پیکربندی شبکه نامعتبر است و نتوانست وارد شود.</translation>
 <translation id="1655462015569774233">{1,plural, =1{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن دیروز به پایان رسیده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع می‌کند. ساعت رایانه‌تان درحال‌حاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر پاسخ منفی است، باید ساعت سیستمتان را درست کنید و سپس این صفحه را بازخوانی کنید.}one{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است. اعتبار گواهی امنیتی آن # روز قبل به پایان رسیده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع می‌کند. ساعت رایانه‌تان درحال‌حاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر پاسخ منفی است، باید ساعت سیستمتان را درست کنید و سپس این صفحه را بازخوانی کنید.}other{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است. اعتبار گواهی امنیتی آن # روز قبل به پایان رسیده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع می‌کند. ساعت رایانه‌تان درحال‌حاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر پاسخ منفی است، باید ساعت سیستمتان را درست کنید و سپس این صفحه را بازخوانی کنید.}}</translation>
 <translation id="168841957122794586">گواهی‌نامه سرور دارای یک کلید رمزنگاری ضعیف است.</translation>
-<translation id="1693754753824026215">صفحه <ph name="SITE" /> نشان می‌دهد:</translation>
 <translation id="1706954506755087368">{1,plural, =1{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن ظاهراً فردا شروع می‌شود. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع می‌کند.}one{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن ظاهراً # روز دیگر شروع می‌شود. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع می‌کند.}other{این سرور نتوانست ثابت کند این <ph name="DOMAIN" /> است؛ اعتبار گواهی امنیتی آن ظاهراً # روز دیگر شروع می‌شود. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصالتان را قطع می‌کند.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">نشانک‌های <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">کد پستی</translation>
 <translation id="6337534724793800597">فیلتر کردن خط‌مشی‌ها براساس نام</translation>
+<translation id="6342069812937806050">فقط اکنون</translation>
 <translation id="6355080345576803305">لغو جلسه عمومی</translation>
 <translation id="6387478394221739770">‏علاقه‌مند به قابلیت‌های جدید و جالب Chrome هستید؟ کانال بتای ما را در chrome.com/beta امتحان کنید.</translation>
 <translation id="6445051938772793705">کشور</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">دستگاه</translation>
 <translation id="6970216967273061347">حوزه</translation>
 <translation id="6973656660372572881">‏هم سرورهای پروکسی ثابت و هم آدرس اسکریپت pac. مشخص شده‌اند.</translation>
-<translation id="6980028882292583085">هشدار جاوا اسکریپت</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">تلاش کردید به دامنه <ph name="DOMAIN" /> بروید اما گواهینامه‌ای که سرور ارائه کرد، دارای یک تاریخ اعتبار بسیار طولانی است و مورد اعتماد نیست.</translation>
 <translation id="7087282848513945231">شهرستان</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">مسیر نمایه</translation>
 <translation id="7441627299479586546">موضوع خط‌مشی اشتباه است</translation>
 <translation id="7485870689360869515">هیچ داده‌ای یافت نشد.</translation>
-<translation id="7521387064766892559">جاوا اسکریپت</translation>
 <translation id="7537536606612762813">اجباری</translation>
 <translation id="7542995811387359312">تکمیل خودکار کارت اعتباری غیر فعال است زیرا این فرم از یک اتصال امن استفاده نمی‌کند.</translation>
 <translation id="7567204685887185387">این سرور نتوانست اثبات کند که این <ph name="DOMAIN" /> است؛ ممکن است گواهی امنیتی آن به صورت تقلبی صادر شده باشد. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی اتصال شما را قطع کرده است.</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 3135f83..05cea54e 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Verkkoasetukset ovat virheelliset eikä niitä voi tuoda.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne vanhentui eilen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä. Tietokoneesi kellonaika on tällä hetkellä <ph name="CURRENT_DATE" />. Onko se oikein? Jos ei, korjaa järjestelmän kellonaika ja päivitä sivu.}other{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne vanhentui # päivää sitten. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä. Tietokoneesi kellonaika on tällä hetkellä <ph name="CURRENT_DATE" />. Onko se oikein? Jos ei, korjaa järjestelmän kellonaika ja päivitä sivu.}}</translation>
 <translation id="168841957122794586">Palvelinvarmenne sisältää heikon salausavaimen.</translation>
-<translation id="1693754753824026215">Sivu osoitteessa <ph name="SITE" /> ilmoittaa:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne on päivätty huomiselle. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.}other{Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne on päivätty # päivää tulevaisuuteen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.}}</translation>
 <translation id="1710259589646384581">Käyttöjärjestelmä</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Verkkotunnuksen <ph name="DOMAIN" /> kirjanmerkit</translation>
 <translation id="6282194474023008486">Postinumero</translation>
 <translation id="6337534724793800597">Suodata käytäntöjä nimen mukaan</translation>
+<translation id="6342069812937806050">Valmistui juuri</translation>
 <translation id="6355080345576803305">Julkisen istunnon ohitus</translation>
 <translation id="6387478394221739770">Oletko kiinnostunut Chromen uusista jännittävistä ominaisuuksista? Kokeile beta-kanavaa osoitteessa chrome.com/beta.</translation>
 <translation id="6445051938772793705">Maa</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Laite</translation>
 <translation id="6970216967273061347">Alue</translation>
 <translation id="6973656660372572881">Sekä kiinteät välityspalvelimet että .pac-URL-osoite on määritetty.</translation>
-<translation id="6980028882292583085">JavaScript-ilmoitus</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Yritit muodostaa yhteyden verkkotunnukseen <ph name="DOMAIN" />, mutta palvelin esitti varmenteen, joka on voimassa liian kauan ollakseen luotettava.</translation>
 <translation id="7087282848513945231">Kunta</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profiilin polku</translation>
 <translation id="7441627299479586546">Väärä käytännön aihe</translation>
 <translation id="7485870689360869515">Tietoja ei löydy.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Pakollinen</translation>
 <translation id="7542995811387359312">Automaattinen luottokortin tietojen täyttäminen on poistettu käytöstä, koska tämä lomake ei käytä suojattua yhteyttä.</translation>
 <translation id="7567204685887185387">Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; sen suojausvarmenne on ehkä luotu vilpillisesti. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 9b1046e..6cdb487 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Petsa ng Build</translation>
 <translation id="1549470594296187301">Dapat naka-enable ang JavaScript upang magamit ang feature na ito.</translation>
 <translation id="1559528461873125649">Walang naturang file o direktoryo</translation>
+<translation id="1629803312968146339">Gusto mo bang i-save ng Chrome ang card na ito?</translation>
 <translation id="1640180200866533862">Mga patakaran ng user</translation>
 <translation id="1644184664548287040">Di-wasto ang configuration ng network at hindi maaaring i-import.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; nag-expire na ang certificate ng seguridad nito kahapon. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon. Sa kasalukuyan, nakatakda ang orasan ng iyong computer sa <ph name="CURRENT_DATE" />. Mukha bang tama iyon? Kung hindi, dapat mong ayusin ang orasan ng iyong system at pagkatapos ay i-refresh ang page na ito.}one{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; nag-expire na ang certificate ng seguridad nito # araw na ang nakalipas. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon. Sa kasalukuyan, nakatakda ang orasan ng iyong computer sa <ph name="CURRENT_DATE" />. Mukha bang tama iyon? Kung hindi, dapat mong ayusin ang orasan ng iyong system at pagkatapos ay i-refresh ang page na ito.}other{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; nag-expire na ang certificate ng seguridad nito # na araw na ang nakalipas. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon. Sa kasalukuyan, nakatakda ang orasan ng iyong computer sa <ph name="CURRENT_DATE" />. Mukha bang tama iyon? Kung hindi, dapat mong ayusin ang orasan ng iyong system at pagkatapos ay i-refresh ang page na ito.}}</translation>
 <translation id="168841957122794586">Naglalaman ang server certificate ng isang mahinang cryptographic key.</translation>
-<translation id="1693754753824026215">Isinasaad ng page sa <ph name="SITE" /> na:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; tinatayang mula sa susunod na araw ang certificate ng seguridad nito. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon.}one{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; tinatayang mula sa # araw sa hinaharap ang certificate ng seguridad nito. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon.}other{Hindi mapatunayan ng server na ito na ito ang <ph name="DOMAIN" />; tinatayang mula sa # na araw sa hinaharap ang certificate ng seguridad nito. Maaaring resulta ito ng maling configuration o kaya ng isang attacker na humahadlang sa iyong koneksyon.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Hindi sinusuportahan ang saklaw ng patakaran.</translation>
 <translation id="4120075327926916474">Gusto mo bang i-save ng Chrome ang impormasyon ng credit card na ito para sa pagkumpleto ng mga form ng web?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Gusto mo bang i-save ng Chromium ang card na ito?</translation>
 <translation id="4171400957073367226">Hindi wasto ang signature sa pag-verify</translation>
 <translation id="4196861286325780578">&amp;Gawing muli ang paglilipat</translation>
 <translation id="4220128509585149162">Mga Pag-crash</translation>
 <translation id="4250680216510889253">Hindi</translation>
 <translation id="4258748452823770588">Maling lagda</translation>
+<translation id="4268298190799576220">Hindi na-verify ng Chromium ang iyong card sa pagkakataong ito. Pakisubukang muli sa ibang pagkakataon.</translation>
 <translation id="4269787794583293679">(Walang username)</translation>
 <translation id="4300246636397505754">Mga suhestyon ng magulang</translation>
 <translation id="4325863107915753736">Hindi nahanap ang artikulo</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">Masyadong mahaba ang panahon ng pagkakaroon ng bisa ng certificate ng server.</translation>
 <translation id="6154808779448689242">Hindi tumutugma ang ibinalik na token sa patakaran sa kasalukuyang token</translation>
 <translation id="6165508094623778733">Matuto nang higit pa</translation>
+<translation id="6218753634732582820">Gusto mo bang alisin ang address sa Chromium?</translation>
 <translation id="6259156558325130047">&amp;Gawing Muli ang Pagbabago sa Ayos</translation>
 <translation id="6263376278284652872">Mga bookmark ng <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Postal code</translation>
 <translation id="6337534724793800597">I-filter ang mga patakaran ayon sa pangalan</translation>
+<translation id="6342069812937806050">Ngayon lang</translation>
 <translation id="6355080345576803305">Override sa pampublikong session</translation>
 <translation id="6387478394221739770">Interesado sa mga astig at bagong tampok sa Chrome? Subukan ang aming beta channel sa chrome.com/beta.</translation>
 <translation id="6445051938772793705">Bansa</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685">Paghahanap ng <ph name="ENGINE" /></translation>
 <translation id="6644283850729428850">Hindi na ginagamit ang patakarang ito.</translation>
 <translation id="6646897916597483132">Ilagay ang CVC na may 4 na digit mula sa harap ng iyong card</translation>
+<translation id="6671697161687535275">Gusto mo bang alisin ang form para sa suhestyon sa Chromium?</translation>
 <translation id="674375294223700098">Hindi alam na error sa certificate ng server</translation>
 <translation id="6753269504797312559">Halaga ng patakaran</translation>
 <translation id="6831043979455480757">Isalin</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Device</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Tinukoy ang parehong mga hindi nababagong proxy server at isang .pac script URL.</translation>
-<translation id="6980028882292583085">Alerto ng JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Sinubukan mong puntahan ang <ph name="DOMAIN" />, ngunit nagpakita ang server ng certificate na masyadong mahaba ang panahon ng pagkakaroon ng bisa upang maging mapagkakatiwalaan.</translation>
 <translation id="7087282848513945231">County</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Path ng Profile</translation>
 <translation id="7441627299479586546">Maling paksa ng patakaran</translation>
 <translation id="7485870689360869515">Walang nahanap na data.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Kinakailangan</translation>
 <translation id="7542995811387359312">Hindi pinagana ang awtomatikong pagpuno ng credit card dahil ang form na ito ay hindi gumagamit ng secure na koneksyon.</translation>
 <translation id="7567204685887185387">Hindi mapatunayan ng server na ito na ito ay <ph name="DOMAIN" />; maaaring mapanlokong ibinigay ang certificate ng seguridad nito. Maaaring dulot ito ng maling configuration o isang umaatake na hinahadlangan ang iyong koneksyon.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Lumabag ang certificate ng server sa limitasyon sa pangalan.</translation>
 <translation id="7600965453749440009">Huwag isalin kailanman ang <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Wala sa sakop ang halaga <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">Gusto mo bang alisin ang credit card sa Chromium?</translation>
 <translation id="7674629440242451245">Interesado sa mga astig at bagong tampok sa Chrome? Subukan ang aming dev channel sa chrome.com/dev.</translation>
 <translation id="7752995774971033316">Hindi pinamamahalaan</translation>
 <translation id="7761701407923456692">Hindi tumutugma sa URL ang certificate ng server.</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index fbe23dc..fc23bcc 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Impossible d'importer la configuration du réseau : elle n'est pas valide.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité a expiré hier. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique. L'horloge de votre ordinateur indique actuellement : <ph name="CURRENT_DATE" />. Cela vous semble-t-il correct ? Si ce n'est pas le cas, vous devez corriger l'horloge de votre système, puis actualiser la page.}one{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité a expiré il y a # jour. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique. L'horloge de votre ordinateur indique actuellement : <ph name="CURRENT_DATE" />. Cela vous semble-t-il correct ? Si ce n'est pas le cas, vous devez corriger l'horloge de votre système, puis actualiser la page.}other{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car son certificat de sécurité a expiré il y a # jours. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique. L'horloge de votre ordinateur indique actuellement : <ph name="CURRENT_DATE" />. Cela vous semble-t-il correct ? Si ce n'est pas le cas, vous devez corriger l'horloge de votre système, puis actualiser la page.}}</translation>
 <translation id="168841957122794586">Le certificat du serveur contient une clé de chiffrement faible.</translation>
-<translation id="1693754753824026215">La page à l'adresse <ph name="SITE" /> indique :</translation>
 <translation id="1706954506755087368">{1,plural, =1{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car la date d'émission de son certificat de sécurité est fixée à demain. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.}one{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car la date d'émission de son certificat de sécurité est ultérieure de # jour à la date du jour. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.}other{Impossible de vérifier que ce serveur est bien <ph name="DOMAIN" />, car la date d'émission de son certificat de sécurité est ultérieure de # jours à la date du jour. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.}}</translation>
 <translation id="1710259589646384581">Système d'exploitation</translation>
 <translation id="1734864079702812349">American Express</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Favoris de <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Code postal</translation>
 <translation id="6337534724793800597">Filtrer les règles par nom</translation>
+<translation id="6342069812937806050">À l'instant</translation>
 <translation id="6355080345576803305">Contournement dû à la session publique</translation>
 <translation id="6387478394221739770">Vous souhaitez bénéficier de nouvelles fonctionnalités Chrome passionnantes ? Essayez notre version bêta à l'adresse chrome.com/beta.</translation>
 <translation id="6445051938772793705">Pays</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Périphérique</translation>
 <translation id="6970216967273061347">District</translation>
 <translation id="6973656660372572881">Les serveurs proxy déterminés et une URL de script .pac sont spécifiés tous les deux.</translation>
-<translation id="6980028882292583085">Alerte JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Vous avez essayé d'accéder à <ph name="DOMAIN" />, mais la durée de validité du certificat du serveur est trop longue pour être fiable.</translation>
 <translation id="7087282848513945231">Comté</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Chemin d'accès au profil</translation>
 <translation id="7441627299479586546">Objet de la règle incorrect.</translation>
 <translation id="7485870689360869515">Aucune donnée n'a été trouvée.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatoire</translation>
 <translation id="7542995811387359312">La saisie automatique des numéros de carte de paiement est désactivée, car la connexion utilisée par ce formulaire n'est pas sécurisée.</translation>
 <translation id="7567204685887185387">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />. Il se peut que son certificat de sécurité ait été émis de manière frauduleuse. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index c6bf39fe..cf71e16b 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">નેટવર્ક ગોઠવણી અમાન્ય છે અને આયાત કરી શકાઇ નથી.</translation>
 <translation id="1655462015569774233">{1,plural, =1{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેના સુરક્ષા પ્રમાણપત્રની સમય સીમા ગઈકાલે સમાપ્ત થઈ ગઈ. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે. તમારા કમ્પ્યુટરની ઘડિયાળને હાલમાં <ph name="CURRENT_DATE" /> પર સેટ કરવામાં આવી છે. શું તે બરાબર લાગે છે? જો ઠીક ન લાગતી હોય, તો તમારે તમારી સિસ્ટમની ઘડિયાળને ઠીક કરવી જોઈએ અને પછી આ પૃષ્ઠ તાજું કરવું જોઈએ.}one{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેના સુરક્ષા પ્રમાણપત્રની સમય સીમા #  દિવસ પહેલાં સમાપ્ત થઈ ગઈ. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે. તમારા કમ્પ્યુટરની ઘડિયાળને હાલમાં <ph name="CURRENT_DATE" /> પર સેટ કરવામાં આવી છે. શું તે બરાબર લાગે છે? જો ઠીક ન લાગતી હોય, તો તમારે તમારી સિસ્ટમની ઘડિયાળને ઠીક કરવી જોઈએ અને પછી આ પૃષ્ઠ તાજું કરવું જોઈએ.}other{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેના સુરક્ષા પ્રમાણપત્રની સમય સીમા #  દિવસ પહેલાં સમાપ્ત થઈ ગઈ. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે. તમારા કમ્પ્યુટરની ઘડિયાળને હાલમાં <ph name="CURRENT_DATE" /> પર સેટ કરવામાં આવી છે. શું તે બરાબર લાગે છે? જો ઠીક ન લાગતી હોય, તો તમારે તમારી સિસ્ટમની ઘડિયાળને ઠીક કરવી જોઈએ અને પછી આ પૃષ્ઠ તાજું કરવું જોઈએ.}}</translation>
 <translation id="168841957122794586">સર્વર પ્રમાણપત્ર એક નબળી ક્રિપ્ટોગ્રાફિક કી ધરાવે છે.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> પરનું પૃષ્ઠ કહે છે:</translation>
 <translation id="1706954506755087368">{1,plural, =1{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર આવતીકાલથી માનવામાં આવે છે તે પ્રમાણે છે. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.}one{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર માનવામાં આવે છે તે પ્રમાણે ભવિષ્યમાં # દિવસથી છે. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.}other{આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર માનવામાં આવે છે તે પ્રમાણે ભવિષ્યમાં # દિવસથી છે. આ કોઇ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઇ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> બુકમાર્ક્સ</translation>
 <translation id="6282194474023008486">પોસ્ટલ કોડ</translation>
 <translation id="6337534724793800597">નામ દ્વારા નીતિઓને ફિલ્ટર કરો</translation>
+<translation id="6342069812937806050">હમણાં જ</translation>
 <translation id="6355080345576803305">સાર્વજનિક સત્ર ઓવરરાઇડ</translation>
 <translation id="6387478394221739770">શું કૂલ નવી Chrome સુવિધાઓમાં રુચિ ધરાવો છો? chrome.com/beta પર અમારી બીટા ચેનલ અજમાવી જુઓ.</translation>
 <translation id="6445051938772793705">દેશ</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">ઉપકરણ</translation>
 <translation id="6970216967273061347">જીલ્લો</translation>
 <translation id="6973656660372572881">નિયત પ્રોક્સી સર્વર્સ અને .pac script URL બન્નેનો ઉલ્લેખ કરેલો છે.</translation>
-<translation id="6980028882292583085">Javascript ચેતવણી</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">તમે <ph name="DOMAIN" /> પર પહોંચવાનો પ્રયાસ કરેલો, પરંતુ સર્વરે એવું પ્રમાણપત્ર પ્રસ્તુત કર્યું જેની માન્યતા અવધિ, વિશ્વસનીય હોવા માટે ખૂબ લાંબી છે.</translation>
 <translation id="7087282848513945231">પરગણું</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">પ્રોફાઇલ પાથ</translation>
 <translation id="7441627299479586546">ખોટો નીતિ વિષય</translation>
 <translation id="7485870689360869515">કોઈ ડેટા મળ્યો નથી.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">ફરજિયાત</translation>
 <translation id="7542995811387359312">આપમેળે ક્રેડિટ કાર્ડ ભરણ અક્ષમ કર્યું છે કારણ કે આ ફોર્મ સુરક્ષિત કનેક્શનનો ઉપયોગ કરતું નથી.</translation>
 <translation id="7567204685887185387">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર કપટપૂર્વક રજૂ કરવામાં આવેલ હોઈ શકે છે. આ કોઈ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 06f4314..9caf8e7f 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">नेटवर्क कॉन्फ़िगरेशन अमान्य है और उसे आयात नहीं किया जा सकेगा.</translation>
 <translation id="1655462015569774233">{1,plural, =1{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा कल समाप्त हो गई थी. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्‍या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पृष्ठ को रीफ्रेश करना चाहिए.}one{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा # दिन पहले समाप्त हो गई है. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्‍या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पृष्ठ को रीफ्रेश करना चाहिए.}other{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसके सुरक्षा प्रमाणपत्र की समय सीमा # दिन पहले समाप्त हो गई है. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है. आपके कंप्यूटर की घड़ी वर्तमान में <ph name="CURRENT_DATE" /> पर सेट है. क्‍या यह सही है? यदि नहीं, तो आपको अपने सिस्टम की घड़ी सही करनी चाहिए और फिर इस पृष्ठ को रीफ्रेश करना चाहिए.}}</translation>
 <translation id="168841957122794586">सर्वर प्रमाणपत्र में कमज़ोर क्रिप्टोग्राफ़िक कुंजी है.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> पर मौजूद पृष्ठ कहता है:</translation>
 <translation id="1706954506755087368">{1,plural, =1{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र कल से माना जाएगा. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है.}one{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र # दिन बाद से माना जाएगा. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है.}other{यह सर्वर प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र # दिन बाद से माना जाएगा. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन को बाधित करने के कारण हो सकता है.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> बुकमार्क</translation>
 <translation id="6282194474023008486">डाक कोड</translation>
 <translation id="6337534724793800597">नाम के अनुसार नीतियां फ़िल्टर करें</translation>
+<translation id="6342069812937806050">अभी</translation>
 <translation id="6355080345576803305">सार्वजनिक सत्र ओवरराइड</translation>
 <translation id="6387478394221739770">बेहतरीन नई Chrome सुविधाओं में रूचि है? chrome.com/beta पर हमारा बीटा चैनल आज़माएं.</translation>
 <translation id="6445051938772793705">देश</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">डिवाइस</translation>
 <translation id="6970216967273061347">जिला</translation>
 <translation id="6973656660372572881">फ़िक्‍स्‍ड प्रॉक्‍सी सर्वर और .pac स्‍क्रिप्‍ट URL दोनों ही निर्दिष्ट हैं.</translation>
-<translation id="6980028882292583085">JavaScript अलर्ट</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">आपने <ph name="DOMAIN" /> तक पहुंचने का प्रयास किया था, लेकिन सर्वर ने ऐसा प्रमाणपत्र प्रस्‍तुत किया जिसकी मान्‍यता अवधि विश्‍वसनीय होने के लिए बहुत लंबी है.</translation>
 <translation id="7087282848513945231">काउंटी</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">प्रोफ़ाइल पथ</translation>
 <translation id="7441627299479586546">गलत नीति विषय</translation>
 <translation id="7485870689360869515">कोई डेटा नहीं मिला</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">आवश्यक</translation>
 <translation id="7542995811387359312">स्वतः क्रेडिट कार्ड भरना अक्षम किया गया है क्योंकि यह फ़ॉर्म किसी सुरक्षित कनेक्शन का उपयोग नहीं करता है.</translation>
 <translation id="7567204685887185387">यह सर्वर यह प्रमाणित नहीं कर सका कि यह <ph name="DOMAIN" /> है; हो सकता है इसका सुरक्षा प्रमाणपत्र धोखे से जारी किया गया हो. ऐसा गलत कॉन्फ़िगरेशन के कारण या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन में अवरोध डालने के कारण हो सकता है.</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index e7fd4ef..d49ff93 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Mrežna konfiguracija nije važeća i nije ju bilo moguće uvesti.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao jučer. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}one{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao prije # dan. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}few{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao prije # dana. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}other{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat istekao prije # dana. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu. Sat vašeg računala trenutačno je postavljen na <ph name="CURRENT_DATE" />. Je li to u redu? Ako nije, ispravite vrijeme na satu sustava, a zatim osvježite ovu stranicu.}}</translation>
 <translation id="168841957122794586">Certifikat poslužitelja sadrži slab kriptografski ključ!</translation>
-<translation id="1693754753824026215">Stranica na web-lokaciji <ph name="SITE" /> navodi sljedeće:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan sutra. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}one{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan # dan u budućnosti. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}few{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan # dana u budućnosti. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}other{Poslužitelj nije mogao dokazati da je to <ph name="DOMAIN" /> jer je sigurnosni certifikat navodno izdan # dana u budućnosti. Razlog može biti pogrešna konfiguracija ili napad na vašu vezu.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Oznake domene <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Poštanski broj</translation>
 <translation id="6337534724793800597">Filtriranje pravila prema nazivu</translation>
+<translation id="6342069812937806050">Samo sad</translation>
 <translation id="6355080345576803305">Nadjačavanje javne sesije</translation>
 <translation id="6387478394221739770">Zanimaju li vas nove, kul značajke preglednika Chrome? Isprobajte naš beta kanal na stranici chrome.com/beta.</translation>
 <translation id="6445051938772793705">Zemlja</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Uređaj</translation>
 <translation id="6970216967273061347">Distrikt</translation>
 <translation id="6973656660372572881">Određeni su fiksni proxy poslužitelji i URL .pac skripte.</translation>
-<translation id="6980028882292583085">JavaScript upozorenje</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Pokušali ste pristupiti domeni <ph name="DOMAIN" />, ali je poslužitelj pružio certifikat koji nije pouzdan zbog predugog razdoblja valjanosti.</translation>
 <translation id="7087282848513945231">Županija</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Putanja profila</translation>
 <translation id="7441627299479586546">Pogrešan predmet pravila</translation>
 <translation id="7485870689360869515">Nema pronađenih podataka.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obavezno</translation>
 <translation id="7542995811387359312">Automatsko popunjavanje kreditne kartice onemogućeno je jer se ovaj obrazac ne služi sigurnom vezom.</translation>
 <translation id="7567204685887185387">Poslužitelj nije mogao dokazati da je <ph name="DOMAIN" />; njegov sigurnosni certifikat možda je lažan. To može biti uzrokovano pogrešnom konfiguracijom ili napadom na vašu vezu.</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 6db8d487..1a247c327 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">A hálózati konfiguráció érvénytelen és nem importálható.</translation>
 <translation id="1655462015569774233">{1,plural, =1{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa tegnap lejárt. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását. Számítógépének órája jelenleg a következőre van állítva: <ph name="CURRENT_DATE" />. Ez megfelelőnek tűnik? Ha nem, állítsa be megfelelően a rendszer óráját, majd frissítse az oldalt.}other{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa # nappal ezelőtt lejárt. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását. Számítógépének órája jelenleg a következőre van állítva: <ph name="CURRENT_DATE" />. Ez megfelelőnek tűnik? Ha nem, állítsa be megfelelően a rendszer óráját, majd frissítse az oldalt.}}</translation>
 <translation id="168841957122794586">A szervertanúsítvány gyenge titkosítási kulcsot tartalmaz.</translation>
-<translation id="1693754753824026215">A <ph name="SITE" /> webhelyen lévő oldal közlendője:</translation>
 <translation id="1706954506755087368">{1,plural, =1{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa elméletileg holnaptól érvényes. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását.}other{A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa elméletileg # nap múlva lép érvénybe. Ennek oka lehet konfigurációs hiba, de az is lehet, hogy egy támadó eltérítette az Ön kapcsolódását.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">American Express</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> könyvjelzők</translation>
 <translation id="6282194474023008486">Irányítószám</translation>
 <translation id="6337534724793800597">Házirendek szűrése név szerint</translation>
+<translation id="6342069812937806050">Éppen most</translation>
 <translation id="6355080345576803305">Nyilvános munkamenet általi felülbírálás</translation>
 <translation id="6387478394221739770">Érdekli néhány remek új Chrome-funkció? Próbálja ki a Béta csatornánkat a chrome.com/beta webhelyen.</translation>
 <translation id="6445051938772793705">Ország</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Készülék</translation>
 <translation id="6970216967273061347">Kerület</translation>
 <translation id="6973656660372572881">Mindkét fix proxyszerver és egy .Pac típusú szkript URL-címe meg van adva.</translation>
-<translation id="6980028882292583085">JavaScript-figyelmeztetés</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Ön megpróbálta elérni a(z) <ph name="DOMAIN" /> domaint, de a szerver olyan tanúsítványt küldött, amelynek érvényességi ideje túl hosszú ahhoz, hogy megbízható legyen.</translation>
 <translation id="7087282848513945231">Megye</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profil elérési útja</translation>
 <translation id="7441627299479586546">Az irányelv tárgya nem megfelelő</translation>
 <translation id="7485870689360869515">Nem található adat.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Kötelező</translation>
 <translation id="7542995811387359312">Az automatikus bankkártya-kitöltés le van tiltva, mivel ez az űrlap nem biztonságos kapcsolatot használ.</translation>
 <translation id="7567204685887185387">A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványát csalással állíthatták ki. Ennek oka lehet konfigurációs hiba, vagy hogy egy támadó eltérítette az Ön kapcsolódását.</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 5f9ea7b7..b4ccadf 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Tanggal Dibuat</translation>
 <translation id="1549470594296187301">JavaScript harus diaktifkan untuk menggunakan fitur ini.</translation>
 <translation id="1559528461873125649">Tidak ada file atau direktori tersebut</translation>
+<translation id="1629803312968146339">Ingin Chrome menyimpan kartu ini?</translation>
 <translation id="1640180200866533862">Kebijakan pengguna</translation>
 <translation id="1644184664548287040">Konfigurasi cadangan tidak valid dan tidak dapat diimpor.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; masa berlaku sertifikat keamanannya telah berakhir kemarin. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda. Jam komputer Anda saat ini diatur ke <ph name="CURRENT_DATE" />. Apakah terlihat sesuai? Jika tidak, Anda harus membenarkan jam sistem dan menyegarkan laman ini.}other{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; masa berlaku sertifikat keamanannya telah berakhir # hari yang lalu. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda. Jam komputer Anda saat ini diatur ke <ph name="CURRENT_DATE" />. Apakah terlihat sesuai? Jika tidak, Anda harus membenarkan jam sistem dan menyegarkan laman ini.}}</translation>
 <translation id="168841957122794586">Sertifikat server berisi kunci kriptografis yang lemah.</translation>
-<translation id="1693754753824026215">Laman di <ph name="SITE" /> menyatakan:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya sepertinya dari esok hari. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda.}other{Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya sepertinya dari # hari mendatang. Hal ini mungkin disebabkan oleh kesalahan konfigurasi, atau ada penyerang yang memintas sambungan internet Anda.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Lingkup kebijakan tidak didukung.</translation>
 <translation id="4120075327926916474">Ingin Chrome menyimpan informasi kartu kredit ini untuk melengkapi formulir web?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Ingin Chromium menyimpan kartu ini?</translation>
 <translation id="4171400957073367226">Tanda tangan verifikasi tidak valid</translation>
 <translation id="4196861286325780578">&amp;Ulangi pemindahan</translation>
 <translation id="4220128509585149162">Kerusakan</translation>
 <translation id="4250680216510889253">Tidak</translation>
 <translation id="4258748452823770588">Tanda tangan salah</translation>
+<translation id="4268298190799576220">Saat ini Chromium tidak dapat memverifikasi kartu. Coba lagi nanti.</translation>
 <translation id="4269787794583293679">(Tidak ada nama pengguna)</translation>
 <translation id="4300246636397505754">Saran induk</translation>
 <translation id="4325863107915753736">Gagal menemukan artikel</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">Sertifikat server memiliki masa berlaku yang terlalu panjang.</translation>
 <translation id="6154808779448689242">Token kebijakan yang dikembalikan tidak cocok dengan token saat ini</translation>
 <translation id="6165508094623778733">Pelajari lebih lanjut</translation>
+<translation id="6218753634732582820">Hapus alamat dari Chromium?</translation>
 <translation id="6259156558325130047">&amp;Ulangi Pengaturan Ulang</translation>
 <translation id="6263376278284652872">Bookmark <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Kode pos</translation>
 <translation id="6337534724793800597">Filter kebijakan menurut nama</translation>
+<translation id="6342069812937806050">Baru saja</translation>
 <translation id="6355080345576803305">Diganti oleh sesi publik</translation>
 <translation id="6387478394221739770">Tertarik dengan fitur Chrome baru yang keren? Coba saluran beta kami di chrome.com/beta.</translation>
 <translation id="6445051938772793705">Negara</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Penelusuran</translation>
 <translation id="6644283850729428850">Kebijakan ini telah usang.</translation>
 <translation id="6646897916597483132">Masukkan 4 digit CVC di depan kartu Anda</translation>
+<translation id="6671697161687535275">Hapus saran formulir dari Chromium?</translation>
 <translation id="674375294223700098">Kesalahan sertifikat server tidak dikenal.</translation>
 <translation id="6753269504797312559">Nilai kebijakan</translation>
 <translation id="6831043979455480757">Terjemahkan</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Perangkat</translation>
 <translation id="6970216967273061347">Distrik</translation>
 <translation id="6973656660372572881">Server proxy tetap dan URL skrip .pac telah ditentukan.</translation>
-<translation id="6980028882292583085">Lansiran JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Anda berusaha menjangkau <ph name="DOMAIN" />, namun server memberikan sertifikat yang masa berlakunya terlalu lama untuk dapat dipercaya.</translation>
 <translation id="7087282848513945231">County</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Jalur Profil</translation>
 <translation id="7441627299479586546">Subjek kebijakan salah</translation>
 <translation id="7485870689360869515">Tidak ada data yang ditemukan.</translation>
-<translation id="7521387064766892559">Javascript</translation>
 <translation id="7537536606612762813">Wajib</translation>
 <translation id="7542995811387359312">Pengisian kartu kredit otomatis dinonaktifkan karena formulir ini tidak menggunakan sambungan aman.</translation>
 <translation id="7567204685887185387">Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya mungkin telah dikeluarkan dengan curang. Hal ini disebabkan oleh kesalahan konfigurasi atau penyerang memotong sambungan Anda.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Sertifikat server melanggar batasan nama.</translation>
 <translation id="7600965453749440009">Jangan pernah terjemahkan bahasa <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Nilai di luar jangkauan <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">Hapus kartu kredit dari Chromium?</translation>
 <translation id="7674629440242451245">Tertarik dengan fitur Chrome baru yang keren? Coba saluran dev kami di chrome.com/dev.</translation>
 <translation id="7752995774971033316">Tidak terkelola</translation>
 <translation id="7761701407923456692">Sertifikat server tidak cocok dengan URL.</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 62cea7ed..9c6cb46 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">La configurazione di rete non è valida e non può essere importata.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza è scaduto ieri. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione. L'orologio del computer è attualmente impostato su <ph name="CURRENT_DATE" />. È corretto? Se è sbagliato, dovresti regolare l'orologio e aggiornare la pagina.}other{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza è scaduto # giorni fa. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione. L'orologio del computer è attualmente impostato su <ph name="CURRENT_DATE" />. È corretto? Se è sbagliato, dovresti regolare l'orologio e aggiornare la pagina.}}</translation>
 <translation id="168841957122794586">Il certificato del server contiene una chiave crittografica debole.</translation>
-<translation id="1693754753824026215">La pagina all'indirizzo <ph name="SITE" /> dice:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza potrebbe essere attivo da domani. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.}other{Questo server non è riuscito a verificare che si tratti di <ph name="DOMAIN" />; il relativo certificato di sicurezza potrebbe essere attivo tra # giorni. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.}}</translation>
 <translation id="1710259589646384581">Sistema operativo</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Segnalibri di <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Codice postale</translation>
 <translation id="6337534724793800597">Filtra i criteri per nome</translation>
+<translation id="6342069812937806050">In questo momento</translation>
 <translation id="6355080345576803305">Sostituzione sessione pubblica</translation>
 <translation id="6387478394221739770">Ti interessano le nuove e straordinarie funzioni di Chrome? Prova il nostro canale beta all'indirizzo chrome.com/beta.</translation>
 <translation id="6445051938772793705">Paese</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distretto</translation>
 <translation id="6973656660372572881">Sono stati specificati sia i server proxy fissi che un URL script .pac.</translation>
-<translation id="6980028882292583085">Avviso JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Hai tentato di visitare il sito <ph name="DOMAIN" />, ma il server ha presentato un certificato con periodo di validità troppo lungo per poter essere ritenuto attendibile.</translation>
 <translation id="7087282848513945231">Contea</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Percorso profilo</translation>
 <translation id="7441627299479586546">Oggetto del criterio errato</translation>
 <translation id="7485870689360869515">Nessun dato trovato.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obbligatoria</translation>
 <translation id="7542995811387359312">La compilazione automatica della carta di credito è disattivata perché questo modulo non utilizza una connessione sicura.</translation>
 <translation id="7567204685887185387">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza potrebbe essere stato emesso in modo fraudolento. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index f014da2..713ac0b 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">‏תאריך ה-Build</translation>
 <translation id="1549470594296187301">‏JavaScript צריך להיות מופעל כדי להשתמש בתכונה זו.</translation>
 <translation id="1559528461873125649">אין קובץ או ספרייה בשם זה</translation>
+<translation id="1629803312968146339">‏האם תרצה ש-Chrome ישמור את הכרטיס הזה?</translation>
 <translation id="1640180200866533862">מדיניות משתמשים</translation>
 <translation id="1644184664548287040">תצורת הרשת אינה חוקית ולא ניתן לייבא אותה.</translation>
 <translation id="1655462015569774233">{1,plural, =1{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג אתמול. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}two{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג לפני יומיים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}many{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג לפני # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}other{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; התוקף של אישור האבטחה שלו פג לפני # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך. התאריך המוגדר כעת בשעון המחשב שלך הוא <ph name="CURRENT_DATE" />. האם זה נכון? אם לא, עליך לכוון את שעון המערכת ולאחר מכן לרענן את הדף הזה.}}</translation>
 <translation id="168841957122794586">אישור השרת מכיל מפתח הצפנה חלש.</translation>
-<translation id="1693754753824026215">הדף ב-<ph name="SITE" /> אומר:</translation>
 <translation id="1706954506755087368">{1,plural, =1{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק מחר. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}two{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק בעוד יומיים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}many{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק בעוד # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}other{השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />; אישור האבטחה שלו אמור להיכנס לתוקף רק בעוד # ימים. ייתכן שהסיבה לכך היא הגדרה שגויה או שתוקף מיירט את החיבור שלך.}}</translation>
 <translation id="1710259589646384581">מערכת הפעלה</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">היקף המדיניות אינו נתמך.</translation>
 <translation id="4120075327926916474">‏האם ברצונך ש-Chrome ישמור פרטים אלה של כרטיס אשראי להשלמת טופסי אינטרנט?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">‏האם תרצה ש-Chromium ישמור את הכרטיס הזה?</translation>
 <translation id="4171400957073367226">חתימת אימות לא חוקית</translation>
 <translation id="4196861286325780578">&amp;ביצוע מחדש של העברה</translation>
 <translation id="4220128509585149162">קריסה</translation>
 <translation id="4250680216510889253">לא</translation>
 <translation id="4258748452823770588">חתימה שגויה</translation>
+<translation id="4268298190799576220">‏Chromium לא הצליח לאמת את הכרטיס הפעם. נסה שוב מאוחר יותר.</translation>
 <translation id="4269787794583293679">(אין שם משתמש)</translation>
 <translation id="4300246636397505754">הצעות להורים</translation>
 <translation id="4325863107915753736">לא ניתן היה למצוא את הפריט</translation>
@@ -227,10 +229,12 @@
 <translation id="6151417162996330722">תקופת התוקף של אישור השרת ארוכה מדי.</translation>
 <translation id="6154808779448689242">אסימון המדיניות שהוחזר אינו תואם לאסימון הנוכחי</translation>
 <translation id="6165508094623778733">למידע נוסף</translation>
+<translation id="6218753634732582820">‏האם להסיר את הכתובת מ-Chromium?</translation>
 <translation id="6259156558325130047">&amp;ביצוע מחדש של שינוי סדר</translation>
 <translation id="6263376278284652872">סימניות <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">מיקוד</translation>
 <translation id="6337534724793800597">סנן מדיניות לפי שם</translation>
+<translation id="6342069812937806050">זה עתה</translation>
 <translation id="6355080345576803305">שינוי הפעלה ציבורית</translation>
 <translation id="6387478394221739770">‏מעוניין בתכונות חדשות ומגניבות של Chrome? נסה את ערוץ הביטא שלנו בכתובת chrome.com/beta.</translation>
 <translation id="6445051938772793705">ארץ</translation>
@@ -243,6 +247,7 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> חיפוש</translation>
 <translation id="6644283850729428850">מדיניות זו אינה בתוקף.</translation>
 <translation id="6646897916597483132">‏הזן את ה-CVC בן ארבע הספרות המופיע בחזית הכרטיס</translation>
+<translation id="6671697161687535275">‏האם להסיר מ-Chromium הצעות בשביל טפסים?</translation>
 <translation id="674375294223700098">שגיאת אישור שרת לא ידוע.</translation>
 <translation id="6753269504797312559">ערך מדיניות</translation>
 <translation id="6831043979455480757">תרגם</translation>
@@ -256,7 +261,6 @@
 <translation id="6965978654500191972">התקן</translation>
 <translation id="6970216967273061347">מחוז</translation>
 <translation id="6973656660372572881">‏צוינו שרתי Proxy קבועים וכתובת אתר של הסקריפט מסוג ‎.Pac</translation>
-<translation id="6980028882292583085">‏התראת JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">ניסית להגיע אל <ph name="DOMAIN" />, אך השרת הציג אישור שתקופת התוקף שלו ארוכה מדי ולכן אינו מהימן.</translation>
 <translation id="7087282848513945231">מחוז (בבריטניה ובאירלנד)</translation>
@@ -279,7 +283,6 @@
 <translation id="7419106976560586862">נתיב פרופיל</translation>
 <translation id="7441627299479586546">נושא המדיניות שגוי</translation>
 <translation id="7485870689360869515">לא נמצאו נתונים.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">הכרחי</translation>
 <translation id="7542995811387359312">מילוי אוטומטי של פרטי כרטיס אשראי מושבת כיוון שטופס זה אינו משתמש בחיבור מאובטח.</translation>
 <translation id="7567204685887185387">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />. ייתכן שאישור האבטחה שלו נופק כהונאה. הסיבה לכך עשויה להיות הגדרה שגויה או תוקף המיירט את החיבור שלך.</translation>
@@ -288,6 +291,7 @@
 <translation id="7592362899630581445">אישור השרת מפר את אילוצי השמות.</translation>
 <translation id="7600965453749440009">אל תתרגם לעולם <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">הערך מחוץ לטווח <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">‏האם להסיר את כרטיס האשראי מ-Chromium?</translation>
 <translation id="7674629440242451245">‏מעוניין בתכונות חדשות ומגניבות של Chrome? נסה את הערוץ שלנו למפתחים בכתובת chrome.com/dev.</translation>
 <translation id="7752995774971033316">ללא ניהול</translation>
 <translation id="7761701407923456692">אישור השרת אינו תואם לכתובת האתר.</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index a800ed7..f446164b 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">ネットワーク設定が無効なためインポートできませんでした。</translation>
 <translation id="1655462015569774233">{1,plural, =1{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書の有効期限が昨日付けで切れています。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。パソコンの時計は現在 <ph name="CURRENT_DATE" />に設定されています。この時刻が正しくない場合は、システムの時計を修正した後このページを更新してください。}other{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書の有効期限が # 日前に切れています。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。パソコンの時計は現在 <ph name="CURRENT_DATE" />に設定されています。この時刻が正しくない場合は、システムの時計を修正した後このページを更新してください。}}</translation>
 <translation id="168841957122794586">サーバー証明書に脆弱な暗号鍵が含まれています。</translation>
-<translation id="1693754753824026215">ページ <ph name="SITE" /> の記述:</translation>
 <translation id="1706954506755087368">{1,plural, =1{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書はおそらく明日以降に利用できるようになります。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。}other{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書はおそらく # 日後から利用できるようになります。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">AMEX</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> のブックマーク</translation>
 <translation id="6282194474023008486">郵便番号</translation>
 <translation id="6337534724793800597">ポリシーを名前でフィルタ</translation>
+<translation id="6342069812937806050">たった今</translation>
 <translation id="6355080345576803305">公開セッションのオーバーライド</translation>
 <translation id="6387478394221739770">Chrome の新しい機能に関心をお持ちでしたら、chrome.com/beta から Beta チャンネルをお試しください。</translation>
 <translation id="6445051938772793705">国</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">デバイス</translation>
 <translation id="6970216967273061347">地区</translation>
 <translation id="6973656660372572881">固定プロキシ サーバーと .pac スクリプト URL の両方が指定されています。</translation>
-<translation id="6980028882292583085">JavaScript のアラート</translation>
 <translation id="7012363358306927923">中国銀聯</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> にアクセスしようとしましたが、サーバーに提示された証明書の有効期限が長すぎて信頼性を確認できませんでした。</translation>
 <translation id="7087282848513945231">郡</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">プロフィール パス</translation>
 <translation id="7441627299479586546">ポリシーの対象が間違っています</translation>
 <translation id="7485870689360869515">データが見つかりません。</translation>
-<translation id="7521387064766892559">Javascript</translation>
 <translation id="7537536606612762813">必須</translation>
 <translation id="7542995811387359312">このフォームは安全な接続を使用していないため、クレジットカードの自動入力が無効になっています。</translation>
 <translation id="7567204685887185387">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書は不正に発行されたものである可能性があります。原因としては、不適切な設定や、悪意のあるユーザーによる接続妨害が考えられます。</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 46707241..a40f4475 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್‌ ಅಮಾನ್ಯವಾಗಿದೆ ಹಾಗೂ ಆಮದು ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="1655462015569774233">{1,plural, =1{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಅವಧಿಯು ನಿನ್ನೆ ಮುಗಿದಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಗಡಿಯಾರವನ್ನು ಪ್ರಸ್ತುತ <ph name="CURRENT_DATE" /> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಅದು ಸರಿಯಾಗಿದೆಯೇ? ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಗಡಿಯಾರವನ್ನು ನೀವು ಸರಿಪಡಿಸಿ ಹಾಗೂ ನಂತರ ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ.}one{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಅವಧಿಯು # ದಿನಗಳ ಹಿಂದೆ ಮುಗಿದಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಗಡಿಯಾರವನ್ನು ಪ್ರಸ್ತುತ <ph name="CURRENT_DATE" /> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಅದು ಸರಿಯಾಗಿದೆಯೇ? ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಗಡಿಯಾರವನ್ನು ನೀವು ಸರಿಪಡಿಸಿ ಹಾಗೂ ನಂತರ ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ.}other{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಅವಧಿಯು # ದಿನಗಳ ಹಿಂದೆ ಮುಗಿದಿದೆ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನ ಗಡಿಯಾರವನ್ನು ಪ್ರಸ್ತುತ <ph name="CURRENT_DATE" /> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಅದು ಸರಿಯಾಗಿದೆಯೇ? ಇಲ್ಲದಿದ್ದರೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಗಡಿಯಾರವನ್ನು ನೀವು ಸರಿಪಡಿಸಿ ಹಾಗೂ ನಂತರ ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ.}}</translation>
 <translation id="168841957122794586">ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರವು ದುರ್ಬಲ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಕೀಯನ್ನು ಹೊಂದಿದೆ.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> ರಲ್ಲಿರುವ ಪುಟವು ಹೀಗೆ ಹೇಳುತ್ತದೆ:</translation>
 <translation id="1706954506755087368">{1,plural, =1{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ; ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರ ಬಹುಶಃ ನಾಳೆಯಿಂದ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.}one{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರ ಬಹುಶಃ ಭವಿಷ್ಯದಲ್ಲಿ # ದಿನಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.}other{ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರ ಬಹುಶಃ ಭವಿಷ್ಯದಲ್ಲಿ # ದಿನಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು</translation>
 <translation id="6282194474023008486">ಪೋಸ್ಟಲ್ ಕೋಡ್</translation>
 <translation id="6337534724793800597">ಹೆಸರಿನ ಪ್ರಕಾರವಾಗಿ ನೀತಿಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ</translation>
+<translation id="6342069812937806050">ಇದೀಗ</translation>
 <translation id="6355080345576803305">ಸಾರ್ವಜನಿಕ ಸೆಷನ್ ಅತಿಕ್ರಮಿಸುವಿಕೆ</translation>
 <translation id="6387478394221739770">ಉತ್ತಮವಾದ ಹೊಸ Chrome ವೈಶಿಷ್ಟ್ಯಗಳಲ್ಲಿ ಆಸಕ್ತಿ ಇದೆಯೇ? chrome.com/beta ನಲ್ಲಿ ನಮ್ಮ ಬೀಟಾ ಚಾನಲ್ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="6445051938772793705">ರಾಷ್ಟ್ರ</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">ಸಾಧನ</translation>
 <translation id="6970216967273061347">ಜಿಲ್ಲೆ</translation>
 <translation id="6973656660372572881">ಹೊಂದಿಸಿದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ಗಳು ಮತ್ತು .pac ಸ್ಕ್ರಿಪ್ಟ್ URL ಎರಡನ್ನೂ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿದೆ.</translation>
-<translation id="6980028882292583085">Javascript ಎಚ್ಚರಿಕೆ</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">ನೀವು <ph name="DOMAIN" /> ಅನ್ನು ತಲುಪಲು ಪ್ರಯತ್ನಿಸಿರುವಿರಿ, ಆದರೆ ಸರ್ವರ್ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿರಲು ತುಂಬ ಉದ್ದವಾದ ವಾಯಿದೆ ಅವಧಿಯನ್ನು ಹೊಂದಿರುವ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸಲ್ಲಿಸಿದೆ.</translation>
 <translation id="7087282848513945231">ರಾಷ್ಟ್ರ</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">ಪ್ರೊಫೈಲ್ ಹಾದಿ</translation>
 <translation id="7441627299479586546">ತಪ್ಪಾದ ನೀತಿಯ ವಿಷಯ</translation>
 <translation id="7485870689360869515">ಯಾವುದೇ ಡೇಟಾ ಕಂಡುಬಂದಿಲ್ಲ.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">ಕಡ್ಡಾಯ</translation>
 <translation id="7542995811387359312">ಈ ಫಾರ್ಮ್ ಸುರಕ್ಷಿತವಾದ ಸಂಪರ್ಕವನ್ನು ಬಳಸುತ್ತಿಲ್ಲವಾದ ಕಾರಣ ಸ್ವಯಂಚಾಲಿತ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಭರ್ತಿ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="7567204685887185387">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರವನ್ನು ವಂಚನೆಯಿಂದ ನೀಡಿರಬಹುದು. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index f0e2163..8c9fe32 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">네트워크 구성이 잘못되어 가져올 수 없습니다.</translation>
 <translation id="1655462015569774233">{1,plural, =1{서버의 보안 인증서가 어제 만료되어 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다. 현재 컴퓨터의 시계가 <ph name="CURRENT_DATE" />로 설정되어 있습니다. 시간이 정확하지 않으면 시스템 시계를 수정한 뒤 이 페이지를 새로고침하세요.}other{서버의 보안 인증서가 #일 전에 만료되어 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다. 현재 컴퓨터의 시계가 <ph name="CURRENT_DATE" />로 설정되어 있습니다. 시간이 정확하지 않으면 시스템 시계를 수정한 뒤 이 페이지를 새로고침하세요.}}</translation>
 <translation id="168841957122794586">서버 인증서에 안전성이 낮은 암호화 키가 포함되어 있습니다.</translation>
-<translation id="1693754753824026215"><ph name="SITE" />의 페이지 내용:</translation>
 <translation id="1706954506755087368">{1,plural, =1{서버의 보안 인증서가 내일 발효될 예정이며 이에 따라 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.}other{서버의 보안 인증서가 #일 후 발효될 예정이며 이에 따라 <ph name="DOMAIN" />임을 입증할 수 없습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> 북마크</translation>
 <translation id="6282194474023008486">우편번호</translation>
 <translation id="6337534724793800597">이름별로 정책 필터링</translation>
+<translation id="6342069812937806050">완료됨</translation>
 <translation id="6355080345576803305">공개 세션 무시</translation>
 <translation id="6387478394221739770">Chrome의 멋진 새 기능에 관심이 있으십니까? chrome.com/beta 페이지에서 베타 채널을 방문해 보세요.</translation>
 <translation id="6445051938772793705">국가</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">기기</translation>
 <translation id="6970216967273061347">구</translation>
 <translation id="6973656660372572881">고정 프록시 서버와 .pac 스크립트 URL이 모두 지정되어 있습니다.</translation>
-<translation id="6980028882292583085">자바스크립트 알림</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" />에 접속하려고 했지만 서버가 제시한 인증서의 유효 기간이 너무 길어서 신뢰할 수 없습니다.</translation>
 <translation id="7087282848513945231">카운티</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">프로필 경로</translation>
 <translation id="7441627299479586546">잘못된 정책 주체</translation>
 <translation id="7485870689360869515">데이터 없음</translation>
-<translation id="7521387064766892559">자바스크립트</translation>
 <translation id="7537536606612762813">필수</translation>
 <translation id="7542995811387359312">양식에 보안 연결이 사용되지 않아 신용카드 자동 채우기가 사용 중지되었습니다.</translation>
 <translation id="7567204685887185387">이 서버가 <ph name="DOMAIN" />임을 입증할 수 없으며 서버의 보안 인증서가 부정한 방식으로 발행되었을 수 있습니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 51e10b8..da5ca2e 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Tinklo konfigūracija netinkama ir jos neįmanoma importuoti.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi vakar. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}one{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dieną. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}few{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dienas. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}many{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dienos. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}other{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikato galiojimas baigėsi prieš # dienų. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko. Šiuo metu kompiuterio laikrodis nustatytas į <ph name="CURRENT_DATE" />. Ar tai tinkama? Jei netinkama, turėtumėte koreguoti sistemos laikrodį ir atnaujinti šį puslapį.}}</translation>
 <translation id="168841957122794586">Serverio sertifikate yra nesudėtingas kriptografinis raktas.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> esančiame puslapyje nurodoma:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios nuo rytojaus. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}one{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienos. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}few{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienų. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}many{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienos. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}other{Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas įsigalios po # dienų. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užpuoliko.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> žymės</translation>
 <translation id="6282194474023008486">Pašto kodas</translation>
 <translation id="6337534724793800597">Filtruoti politiką pagal pavadinimą</translation>
+<translation id="6342069812937806050">Ką tik</translation>
 <translation id="6355080345576803305">Viešosios sesijos nepaisymas</translation>
 <translation id="6387478394221739770">Domina naujos „Chrome“ funkcijos? Išbandykite mūsų beta kanalą adresu chrome.com/beta.</translation>
 <translation id="6445051938772793705">Šalis</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Įrenginys</translation>
 <translation id="6970216967273061347">Rajonas</translation>
 <translation id="6973656660372572881">Nurodyti fiksuoti įgaliotieji serveriai ir .pac scenarijaus URL.</translation>
-<translation id="6980028882292583085">„JavaScript“ įspėjimas</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Bandėte pasiekti <ph name="DOMAIN" />, bet serveris pateikė sertifikatą, kurio galiojimo laikotarpis per ilgas, kad būtų patikimas.</translation>
 <translation id="7087282848513945231">Apygarda</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profilio kelias</translation>
 <translation id="7441627299479586546">Netinkamas politikos objektas</translation>
 <translation id="7485870689360869515">Nerasta jokių duomenų.</translation>
-<translation id="7521387064766892559">„JavaScript“</translation>
 <translation id="7537536606612762813">Privaloma</translation>
 <translation id="7542995811387359312">Automatinis kredito kortelės informacijos pildymas neleidžiamas, nes šiai formai nenaudojamas saugus ryšys.</translation>
 <translation id="7567204685887185387">Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas gali būti neteisėtai išduotas. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užgrobėjo.</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 117af9f7..b4e2933 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Tīkla konfigurācija nav derīga, un to nevarēja importēt.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās vakar. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}zero{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās pirms # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}one{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās pirms # dienas. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}other{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; tā drošības sertifikāta derīguma termiņš beidzās pirms # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}}</translation>
 <translation id="168841957122794586">Servera sertifikāts ietver vāju kriptogrāfisko atslēgu.</translation>
-<translation id="1693754753824026215">Lapa vietnē <ph name="SITE" /> saka:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties rīt. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}zero{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties pēc # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}one{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties pēc # dienas. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}other{Šis serveris nevarēja pierādīt, ka ir <ph name="DOMAIN" />; šķiet, ka tā drošības sertifikāts sāks darboties pēc # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu.}}</translation>
 <translation id="1710259589646384581">Operētājsistēma</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> grāmatzīmes</translation>
 <translation id="6282194474023008486">Pasta indekss</translation>
 <translation id="6337534724793800597">Filtrēt politikas pēc nosaukuma</translation>
+<translation id="6342069812937806050">Tikko</translation>
 <translation id="6355080345576803305">Publiskas sesijas ignorēšana</translation>
 <translation id="6387478394221739770">Vai jūs interesē jaunas Chrome funkcijas? Izmēģiniet mūsu Beta versiju, kas pieejama vietnē chrome.com/beta.</translation>
 <translation id="6445051938772793705">Valsts</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Ierīce</translation>
 <translation id="6970216967273061347">Rajons</translation>
 <translation id="6973656660372572881">Ir norādīti gan fiksēti starpniekserveri, gan .pac skripta URL.</translation>
-<translation id="6980028882292583085">JavaScript trauksme</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Jūs mēģinājāt sasniegt domēnu <ph name="DOMAIN" />, bet serveris uzrādīja sertifikātu, kura derīguma periods ir pārāk ilgs, lai būtu uzticams.</translation>
 <translation id="7087282848513945231">Grāfiste</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profila ceļš</translation>
 <translation id="7441627299479586546">Politikas subjekts nav pareizs.</translation>
 <translation id="7485870689360869515">Dati netika atrasti.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligāti</translation>
 <translation id="7542995811387359312">Automātiska kredītkartes numura ievadīšana ir atspējota, jo šai veidlapai netiek izmantots drošs savienojums.</translation>
 <translation id="7567204685887185387">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts, iespējams, ir izveidots krāpnieciski. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 5882b52..4c8c6d4 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ അസാധുവായതിനാൽ ഇമ്പോർട്ടുചെയ്യാൻ കഴിഞ്ഞില്ല.</translation>
 <translation id="1655462015569774233">{1,plural, =1{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് ഇന്നലെ കാലഹരണപ്പെട്ടു. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ക്ലോക്ക് നിലവിൽ <ph name="CURRENT_DATE" /> എന്ന് സജ്ജമാക്കി. അത് ശരിയാണോ? അല്ലെങ്കിൽ, നിങ്ങൾ സിസ്റ്റത്തിന്റെ ക്ലോക്ക് ശരിയാക്കി ഈ പേജ് പുതുക്കുക.}other{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; ഇതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് # ദിവസം മുമ്പ് കാലഹരണപ്പെട്ടു. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്. നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ക്ലോക്ക് നിലവിൽ <ph name="CURRENT_DATE" /> എന്ന് സജ്ജമാക്കി. അത് ശരിയാണോ? അല്ലെങ്കിൽ, നിങ്ങൾ സിസ്റ്റത്തിന്റെ ക്ലോക്ക് ശരിയാക്കി ഈ പേജ് പുതുക്കുക.}}</translation>
 <translation id="168841957122794586">സെർവർ സർട്ടിഫിക്കറ്റിൽ ഒരു ദുർബലമായ ഗൂഢഭാഷ കീ ഉൾപ്പെടുന്നു.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> ലെ പേജ് പറയുന്നത്:</translation>
 <translation id="1706954506755087368">{1,plural, =1{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് ഇന്നലെ മുതൽ സാധുവല്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.}other{ഈ സെർവറിന് ഇത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷാ സർട്ടിഫിക്കറ്റ് # ദിവസം മുതൽ സാധുവായിരിക്കില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു ആക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> ബുക്ക്‌മാർക്കുകൾ</translation>
 <translation id="6282194474023008486">തപാല്‍ കോഡ്</translation>
 <translation id="6337534724793800597">പേരിന്റെ ക്രമത്തിൽ നയങ്ങൾ ഫിൽട്ടർ ചെയ്യുക</translation>
+<translation id="6342069812937806050">ഇപ്പോള്‍‌</translation>
 <translation id="6355080345576803305">പൊതു സെഷൻ അസാധുവാക്കി</translation>
 <translation id="6387478394221739770">Chrome-ന്റെ രസകരമായ പുതിയ സവിശേഷതകളിൽ താൽപ്പര്യമുണ്ടോ? chrome.com/beta-യിൽ ഞങ്ങളുടെ ബീറ്റ ചാനൽ പരീക്ഷിക്കുക.</translation>
 <translation id="6445051938772793705">രാജ്യം</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">ഉപാധി</translation>
 <translation id="6970216967273061347">ജില്ല</translation>
 <translation id="6973656660372572881">സ്ഥിരമായ പ്രോക്‌സി സെർവറുകളും ഒരു സ്‌ക്രിപ്റ്റ് URL-ഉം വ്യക്തമാക്കിയിരിക്കുന്നു.</translation>
-<translation id="6980028882292583085">JavaScript അലേര്‍ട്ട്</translation>
 <translation id="7012363358306927923">ചൈന UnionPay</translation>
 <translation id="7050187094878475250">നിങ്ങൾ <ph name="DOMAIN" /> എന്നതിലെത്താൻ ശ്രമിച്ചു, എന്നാൽ തീരെ വിശ്വാസയോഗ്യമല്ലാത്ത ഒരു കാലാവധിയുള്ള സർട്ടിഫിക്കറ്റാണ് സെർവർ കാണിക്കുന്നത്.</translation>
 <translation id="7087282848513945231">രാജ്യം</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">പ്രൊഫൈല്‍ പാത</translation>
 <translation id="7441627299479586546">തെറ്റായ നയ വിഷയം</translation>
 <translation id="7485870689360869515">ഡാറ്റകളൊന്നും കണ്ടെത്തിയില്ല.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">നിർബന്ധിതം</translation>
 <translation id="7542995811387359312">ഈ ഫോം ഒരു സുരക്ഷിത കണക്ഷന്‍ ഉപയോഗിക്കാത്തതിനാല്‍ സ്വപ്രേരിത ക്രെഡിറ്റ് കാര്‍ഡ് പൂരിപ്പിക്കല്‍ അപ്രാപ്തമാക്കി.</translation>
 <translation id="7567204685887185387">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; സെർവറിന്റെ സുരക്ഷ സർട്ടിഫിക്കറ്റ് വഞ്ചനാപരമായി ഇഷ്യൂ ചെയ്‌തിരിക്കാം. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index f94034d..ca26e30 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">नेटवर्क कॉन्फिगरेशन अवैध आहे आणि आयात केले जाऊ शकले नाही.</translation>
 <translation id="1655462015569774233">{1,plural, =1{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र काल कालबाह्य झाले. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते. आपले संगणक सध्या <ph name="CURRENT_DATE" /> वर सेट आहे. ते योग्य दिसते आहे? नसल्यास, आपण आपल्या सिस्टीमचे घड्याळ दुरूस्त करावे आणि त्यानंतर हे पृष्ठ रीफ्रेश करा.}one{हा सर्व्हर हे <ph name="DOMAIN" />असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र # दिवसांपूर्वी कालबाह्य झाले. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते. आपले संगणक सध्या <ph name="CURRENT_DATE" /> वर सेट आहे. ते योग्य दिसते आहे? नसल्यास, आपण आपल्या सिस्टीमचे घड्याळ दुरूस्त करावे आणि त्यानंतर हे पृष्ठ रीफ्रेश करा.}other{हा सर्व्हर हे <ph name="DOMAIN" />असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र # दिवसांपूर्वी कालबाह्य झाले. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते. आपले संगणक सध्या <ph name="CURRENT_DATE" /> वर सेट आहे. ते योग्य दिसते आहे? नसल्यास, आपण आपल्या सिस्टीमचे घड्याळ दुरूस्त करावे आणि त्यानंतर हे पृष्ठ रीफ्रेश करा.}}</translation>
 <translation id="168841957122794586">सर्व्हर प्रमाणपत्रात एक कमकुवत क्रिप्टोग्राफिक की आहे.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> वरील पृष्ठ म्हणते:</translation>
 <translation id="1706954506755087368">{1,plural, =1{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र उद्यापासून मानले जाईल. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.}one{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र पुढील # दिवसांपासून मानले जाईल. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.}other{हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षा प्रमाणपत्र पुढील # दिवसांपासून मानले जाईल. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> बुकमार्क</translation>
 <translation id="6282194474023008486">पोस्टल कोड</translation>
 <translation id="6337534724793800597">धोरणे नावानुसार फिल्टर करा</translation>
+<translation id="6342069812937806050">आत्ताच</translation>
 <translation id="6355080345576803305">सार्वजनिक सत्र अधिशून्य</translation>
 <translation id="6387478394221739770">छान नवीन Chrome वैशिष्ट्यांमध्ये स्वारस्य आहे? chrome.com/beta वरील आमचे बीटा चॅनेल वापरून पहा.</translation>
 <translation id="6445051938772793705">देश</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">डिव्हाइस</translation>
 <translation id="6970216967273061347">‍जिल्‍हा</translation>
 <translation id="6973656660372572881">निश्चित प्रॉक्सी सर्व्हर आणि .pac स्क्रिप्ट URL निर्दिष्‍ट करण्‍यात आले आहेत.</translation>
-<translation id="6980028882292583085">Javascript अ‍ॅलर्ट</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">आपण <ph name="DOMAIN" /> वर पोहोचण्याचा प्रयत्न केला, परंतु सर्व्हरने एक प्रमाणपत्र सादर केले आहे ज्याचा वैधता कालावधी हा विश्वासार्हतेसाठी खूप मोठा आहे.</translation>
 <translation id="7087282848513945231">परगणा</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">प्रोफाइल पथ</translation>
 <translation id="7441627299479586546">चुकीचे धोरण विषय</translation>
 <translation id="7485870689360869515">डेटा आढळला नाही.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">अनिवार्य</translation>
 <translation id="7542995811387359312">स्वयंचलित क्रेडिट कार्ड भरणे अक्षम झाले आहे कारण हा फॉर्म सुरक्षित कनेक्शन वापरत नाही.</translation>
 <translation id="7567204685887185387">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता प्रमाणपत्र कदाचित लबाडीने जारी केले असावे. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index ba088622..8c421a3e 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Tarikh Bina</translation>
 <translation id="1549470594296187301">Javascript mesti didayakan untuk menggunakan ciri ini.</translation>
 <translation id="1559528461873125649">Tiada fail atau direktori sedemikian</translation>
+<translation id="1629803312968146339">Adakah anda mahu Chrome menyimpan kad ini?</translation>
 <translation id="1640180200866533862">Dasar pengguna</translation>
 <translation id="1644184664548287040">Konfigurasi rangkaian tidak sah dan tidak boleh diimport.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Pelayan ini tidak dapat membuktikan bahawa <ph name="DOMAIN" />; sijil keselamatannya tamat tempoh semalam. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda. Jam komputer anda ditetapkan kepada <ph name="CURRENT_DATE" /> pada masa ini. Adakah itu betul? Jika tidak, anda perlu membetulkan jam sistem anda dan kemudian muat semula halaman ini.}other{Pelayan ini tidak dapat membuktikan bahawa <ph name="DOMAIN" />; sijil keselamatannya tamat tempoh # hari yang lalu. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda. Jam komputer anda ditetapkan kepada <ph name="CURRENT_DATE" /> pada masa ini. Adakah itu betul? Jika tidak, anda perlu membetulkan jam sistem anda dan kemudian muat semula halaman ini.}}</translation>
 <translation id="168841957122794586">Sijil pelayan mengandungi kunci kriptografi yang lemah.</translation>
-<translation id="1693754753824026215">Halaman di <ph name="SITE" /> menyatakan:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Pelayan ini tidak dapat membuktikan bahawa itu <ph name="DOMAIN" />;sijil keselamatannya sepatutnya bermula esok. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda.}other{Pelayan ini tidak dapat membuktikan bahawa itu <ph name="DOMAIN" />; sijil keselamatannya sepatutnya bermula # hari lagi. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Skop dasar tidak disokong.</translation>
 <translation id="4120075327926916474">Adakah anda mahu Chrome menyimpan maklumat kad kredit ini dengan melengkapkan borang web?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Adakah anda mahu Chromium menyimpan kad ini?</translation>
 <translation id="4171400957073367226">Tandatangan pengesahan tidak sah</translation>
 <translation id="4196861286325780578">&amp;Buat semula pindahkan</translation>
 <translation id="4220128509585149162">Nahas</translation>
 <translation id="4250680216510889253">Tidak</translation>
 <translation id="4258748452823770588">Tandatangan tidak elok</translation>
+<translation id="4268298190799576220">Chromium tidak dapat mengesahkan kad anda pada masa ini. Sila cuba lagi nanti.</translation>
 <translation id="4269787794583293679">(Tiada nama pengguna)</translation>
 <translation id="4300246636397505754">Cadangan ibu bapa</translation>
 <translation id="4325863107915753736">Gagal menemui artikel</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">Sijil pelayan mempunyai tempoh sah yang terlalu panjang.</translation>
 <translation id="6154808779448689242">Token dasar yang dikembalikan tidak sepadan dengan token semasa</translation>
 <translation id="6165508094623778733">Ketahui lebih lanjut</translation>
+<translation id="6218753634732582820">Alih keluar alamat daripada Chromium?</translation>
 <translation id="6259156558325130047">&amp;Buat Asal Susun Semula</translation>
 <translation id="6263376278284652872">Penanda halaman <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Poskod</translation>
 <translation id="6337534724793800597">Tapis dasar mengikut nama</translation>
+<translation id="6342069812937806050">Sebentar tadi</translation>
 <translation id="6355080345576803305">Pembatalan sesi awam</translation>
 <translation id="6387478394221739770">Berminat dengan ciri Chrome baharu yang hebat? Cuba saluran beta kami di chrome.com/beta.</translation>
 <translation id="6445051938772793705">Negara</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Carian</translation>
 <translation id="6644283850729428850">Dasar ini telah dikecam.</translation>
 <translation id="6646897916597483132">Masukkan CVC 4 digit dari bahagian depan kad anda</translation>
+<translation id="6671697161687535275">Alih keluar cadangan borang daripada Chromium?</translation>
 <translation id="674375294223700098">Ralat sijil pelayan tidak diketahui.</translation>
 <translation id="6753269504797312559">Nilai dasar</translation>
 <translation id="6831043979455480757">Terjemah</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Peranti</translation>
 <translation id="6970216967273061347">Daerah</translation>
 <translation id="6973656660372572881">Pelayan proksi tetap dan juga URL skrip .pac tidak ditetapkan.</translation>
-<translation id="6980028882292583085">Makluman Javascript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Anda cuba untuk mencapai <ph name="DOMAIN" />, tetapi pelayan memberikan sijil yang tempoh sahnya terlalu panjang untuk boleh dipercayai.</translation>
 <translation id="7087282848513945231">Daerah</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Laluan Profil</translation>
 <translation id="7441627299479586546">Subjek dasar salah</translation>
 <translation id="7485870689360869515">Tiada data dijumpai.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Wajib</translation>
 <translation id="7542995811387359312">Pengisian kad kredit automatik dilumpuhkan kerana borang ini tidak menggunakan sambungan selamat.</translation>
 <translation id="7567204685887185387">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya mungkin telah dikeluarkan melalui penipuan. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintasi sambungan anda.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Sijil pelayan melanggar kekangan nama.</translation>
 <translation id="7600965453749440009">Jangan sekali-kali terjemahkan <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Nilai berada di luar julat <ph name="VALUE" /></translation>
+<translation id="7637571805876720304">Alih keluar kad kredit daripada Chromium?</translation>
 <translation id="7674629440242451245">Berminat dengan ciri Chrome baharu yang hebat? Cuba saluran pembangun kami di chrome.com/dev.</translation>
 <translation id="7752995774971033316">Tidak Diurus</translation>
 <translation id="7761701407923456692">Sijil pelayan tidak sepadan dengan URL.</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index b8734c3..2ee0156 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">De netwerkconfiguratie is ongeldig en kan niet worden geïmporteerd.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is gisteren verlopen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept. De klok van je computer is momenteel ingesteld op <ph name="CURRENT_DATE" />. Is dat correct? Zo niet, dan moet je de klok van je systeem aanpassen en vervolgens deze pagina vernieuwen.}other{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is # dagen geleden verlopen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept. De klok van je computer is momenteel ingesteld op <ph name="CURRENT_DATE" />. Is dat correct? Zo niet, dan moet je de klok van je systeem aanpassen en vervolgens deze pagina vernieuwen.}}</translation>
 <translation id="168841957122794586">Het servercertificaat bevat een zwakke cryptografische sleutel.</translation>
-<translation id="1693754753824026215">De pagina op <ph name="SITE" /> meldt het volgende:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is zogenaamd van morgen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.}other{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is zogenaamd van # dagen in de toekomst. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.}}</translation>
 <translation id="1710259589646384581">Besturingssysteem</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Bladwijzers voor <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Postcode</translation>
 <translation id="6337534724793800597">Beleid filteren op naam</translation>
+<translation id="6342069812937806050">Zojuist</translation>
 <translation id="6355080345576803305">Overschrijving voor openbare sessie</translation>
 <translation id="6387478394221739770">Ben je geïnteresseerd in nieuwe, coole Chrome-functies? Probeer ons bèta-kanaal op chrome.com/beta.</translation>
 <translation id="6445051938772793705">Land</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Apparaat</translation>
 <translation id="6970216967273061347">District</translation>
 <translation id="6973656660372572881">Zowel vaste proxyservers als een pac-script-URL worden gespecificeerd.</translation>
-<translation id="6980028882292583085">JavaScript-melding</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Je hebt geprobeerd <ph name="DOMAIN" /> te bereiken, maar de server heeft een certificaat gepresenteerd waarvan de geldigheidsperiode te lang is om betrouwbaar te zijn.</translation>
 <translation id="7087282848513945231">County</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profielpad</translation>
 <translation id="7441627299479586546">Onjuist beleidsonderwerp</translation>
 <translation id="7485870689360869515">Geen gegevens gevonden.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Verplicht</translation>
 <translation id="7542995811387359312">Het automatisch invullen van creditcardnummers is uitgeschakeld, omdat dit formulier geen beveiligde verbinding gebruikt.</translation>
 <translation id="7567204685887185387">De server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het beveiligingscertificaat van de server is mogelijk frauduleus verstrekt. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 57c9ee2..0e1b716 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Nettverkskonfigurasjonen er ugyldig og kan ikke importeres.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet utløp i går. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet. Klokken på datamaskinen din er stilt til <ph name="CURRENT_DATE" />. Er det riktig? Hvis ikke bør du stille klokken på systemet og laste inn denne siden på nytt.}other{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet utløp for # dager siden. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet. Klokken på datamaskinen din er stilt til <ph name="CURRENT_DATE" />. Er det riktig? Hvis ikke bør du stille klokken på systemet og laste inn denne siden på nytt.}}</translation>
 <translation id="168841957122794586">Tjenersertifikatet inneholder en svak kryptografisk nøkkel.</translation>
-<translation id="1693754753824026215">Varsel fra <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet ser ut til å være fra i morgen. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet.}other{Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />, ettersom sikkerhetssertifikatet ser ut til å være fra # dager frem i tid. Dette kan skyldes en feilkonfigurasjon eller at en angriper avskjærer tilkoblingen mellom deg og nettstedet.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" />-bokmerker</translation>
 <translation id="6282194474023008486">Postnummer</translation>
 <translation id="6337534724793800597">Filtrér retningslinjer etter navn</translation>
+<translation id="6342069812937806050">Akkurat nå</translation>
 <translation id="6355080345576803305">Offentlig økt-overstyring</translation>
 <translation id="6387478394221739770">Interessert i nye kule Chrome-funksjoner? Prøv betakanalen vår på chrome.com/beta</translation>
 <translation id="6445051938772793705">Land</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Enhet</translation>
 <translation id="6970216967273061347">Område</translation>
 <translation id="6973656660372572881">Både statiske proxytjenere og en .pac-skriptnettadresse er angitt.</translation>
-<translation id="6980028882292583085">JavaScript-varsel</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Du prøvde å nå <ph name="DOMAIN" />. Tjeneren presenterte et sertifikat som har en gyldighetsperiode som er for lang til å være pålitelig.</translation>
 <translation id="7087282848513945231">Fylke</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profilbane</translation>
 <translation id="7441627299479586546">Feil emne for innstillinger</translation>
 <translation id="7485870689360869515">Ingen data ble funnet.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatorisk</translation>
 <translation id="7542995811387359312">Automatisk utfylling av kredittkort er deaktivert fordi dette skjemaet ikke bruker en sikker tilkobling.</translation>
 <translation id="7567204685887185387">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Tjenerens sikkerhetssertifikat kan ha blitt utstedt på uredelig vis. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index a82cd12bd..22fa1dd 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Konfiguracja sieci jest nieprawidłowa i nie można jej zaimportować.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł wczoraj. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}few{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł # dni temu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}many{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł # dni temu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}other{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa wygasł # dnia temu. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia. Zegar komputera jest obecnie ustawiony na <ph name="CURRENT_DATE" />. Czy to prawidłowa data? Jeśli nie, musisz skorygować zegar systemu, a następnie odświeżyć tę stronę.}}</translation>
 <translation id="168841957122794586">Certyfikat serwera ma słaby klucz kryptograficzny.</translation>
-<translation id="1693754753824026215">Komunikat ze strony <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać od jutra. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}few{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać za # dni. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}many{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać za # dni. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}other{Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa przypuszczalnie zacznie obowiązywać za # dnia. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia.}}</translation>
 <translation id="1710259589646384581">System operacyjny</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Zakładki <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Kod pocztowy</translation>
 <translation id="6337534724793800597">Filtruj zasady według nazwy</translation>
+<translation id="6342069812937806050">Przed momentem</translation>
 <translation id="6355080345576803305">Zastąpienie sesji publicznej</translation>
 <translation id="6387478394221739770">Interesują Cię nowe, przydatne funkcje Chrome? Wypróbuj wersję beta ze strony chrome.com/beta.</translation>
 <translation id="6445051938772793705">Kraj</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Urządzenie</translation>
 <translation id="6970216967273061347">Okręg</translation>
 <translation id="6973656660372572881">Określono zarówno stałe serwery proxy, jak i URL skryptu PAC.</translation>
-<translation id="6980028882292583085">Alert JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Próbujesz połączyć się z domeną <ph name="DOMAIN" />, ale serwer przedstawił certyfikat, którego okres ważności jest za długi, by był wiarygodny.</translation>
 <translation id="7087282848513945231">Hrabstwo</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Ścieżka profilu</translation>
 <translation id="7441627299479586546">Nieprawidłowy podmiot zasady</translation>
 <translation id="7485870689360869515">Nie znaleziono danych.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obowiązkowe</translation>
 <translation id="7542995811387359312">Automatyczne wypełnianie danych karty kredytowej jest wyłączone, ponieważ ten formularz nie korzysta z bezpiecznego połączenia.</translation>
 <translation id="7567204685887185387">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa mógł zostać wydany w celu oszustwa. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index 84551ced..3fbe215 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">A configuração de rede é inválida e não pôde ser importada.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o certificado de segurança dele expirou ontem. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor. O relógio do seu computador está definido para <ph name="CURRENT_DATE" />. Essa data está correta? Se não estiver, corrija o relógio do sistema e depois atualize esta página.}one{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele expirou há # dias. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor. O relógio do seu computador está definido para <ph name="CURRENT_DATE" />. Essa data está correta? Se não estiver, corrija o relógio do sistema e depois atualize esta página.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele expirou há # dias. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor. O relógio do seu computador está definido para <ph name="CURRENT_DATE" />. Essa data está correta? Se não estiver, corrija o relógio do sistema e depois atualize esta página.}}</translation>
 <translation id="168841957122794586">O certificado do servidor contém uma chave de criptografia fraca.</translation>
-<translation id="1693754753824026215">A página em <ph name="SITE" /> diz:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele está com a data de amanhã. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.}one{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele está com uma data de # dias depois de hoje. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança dele está com uma data de # dias depois de hoje. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.}}</translation>
 <translation id="1710259589646384581">SO</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Favoritos de <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Código postal</translation>
 <translation id="6337534724793800597">Filtrar políticas por nome</translation>
+<translation id="6342069812937806050">Neste instante</translation>
 <translation id="6355080345576803305">Modificação de sessão pública</translation>
 <translation id="6387478394221739770">Interessado em novos recursos interessantes do Google Chrome? Veja nosso Canal Beta em chrome.com/beta.</translation>
 <translation id="6445051938772793705">País</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Ambos os servidores proxy fixo e um URL de script .pac foram especificados.</translation>
-<translation id="6980028882292583085">Alerta JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Você tentou acessar <ph name="DOMAIN" />, mas o servidor apresentou um certificado cujo período de validade é extremamente longo, o que não é confiável.</translation>
 <translation id="7087282848513945231">Condado</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Caminho de perfil</translation>
 <translation id="7441627299479586546">Assunto da política incorreto</translation>
 <translation id="7485870689360869515">Nenhum dado encontrado</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obrigatória</translation>
 <translation id="7542995811387359312">O preenchimento automático do cartão de crédito está desativado porque este formulário não usa uma conexão segura.</translation>
 <translation id="7567204685887185387">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança pode ter sido emitido de forma fraudulenta. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 398b6b88..f70f69a 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">A configuração de rede é inválida e não pode ser importada.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o seu certificado de segurança expirou ontem. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação. O relógio do seu computador está atualmente configurado para <ph name="CURRENT_DATE" />. Será que isso está correto? Em caso negativo, deve corrigir o relógio do seu sistema e depois atualizar esta página.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o seu certificado de segurança expirou há # dias. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação. O relógio do seu computador está atualmente configurado para <ph name="CURRENT_DATE" />. Será que isso está correto? Em caso negativo, deve corrigir o relógio do seu sistema e depois atualizar esta página.}}</translation>
 <translation id="168841957122794586">O certificado do servidor contém uma chave criptográfica fraca.</translation>
-<translation id="1693754753824026215">A página em <ph name="SITE" /> indica:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; o seu certificado de segurança é supostamente de amanhã. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.}other{Este servidor não conseguiu provar que é <ph name="DOMAIN" />; a data do seu certificado de segurança é supostamente daqui a # dias. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.}}</translation>
 <translation id="1710259589646384581">SO</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Marcadores do <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Código postal</translation>
 <translation id="6337534724793800597">Filtrar políticas pelo nome</translation>
+<translation id="6342069812937806050">Mesmo agora</translation>
 <translation id="6355080345576803305">Substituição da sessão pública</translation>
 <translation id="6387478394221739770">Está interessado nas novas e fantásticas funcionalidades do Chrome? Experimente o nosso canal beta em chrome.com/beta.</translation>
 <translation id="6445051938772793705">País</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispositivo</translation>
 <translation id="6970216967273061347">Distrito</translation>
 <translation id="6973656660372572881">Foram especificados servidores proxy fixos e um URL de script .pac.</translation>
-<translation id="6980028882292583085">Alerta de JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Tentou aceder a <ph name="DOMAIN" />, mas o servidor apresentou um certificado cujo período de validade é demasiado longo para ser fidedigno.</translation>
 <translation id="7087282848513945231">Condado</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Caminho do Perfil</translation>
 <translation id="7441627299479586546">Assunto da política incorreto</translation>
 <translation id="7485870689360869515">Não foram encontrados dados.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obrigatório</translation>
 <translation id="7542995811387359312">O preenchimento automático de cartões de crédito está desactivado, porque este formulário não utiliza uma ligação segura.</translation>
 <translation id="7567204685887185387">Este servidor não conseguiu provar que é o domínio <ph name="DOMAIN" />; o respetivo certificado de segurança poderá ter sido emitido de forma fraudulenta. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 319eba8..76c72ee 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Configurația rețelei este nevalidă și nu a putut fi importată.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Certificatul său de securitate a expirat ieri. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}few{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Certificatul său de securitate a expirat acum # zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}other{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Certificatul său de securitate a expirat acum # de zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}}</translation>
 <translation id="168841957122794586">Certificatul de server conține o cheie criptografică slabă.</translation>
-<translation id="1693754753824026215">Pagina de la <ph name="SITE" /> afișează mesajul:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Data de emitere a certificatului său de securitate este mâine. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.}few{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Data de emitere a certificatului său de securitate este în viitor, peste # zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.}other{Acest server nu a putut dovedi că este <ph name="DOMAIN" />. Data de emitere a certificatului său de securitate este în viitor, peste # de zile. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator.}}</translation>
 <translation id="1710259589646384581">Sistem de operare</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Marcaje <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Cod poștal</translation>
 <translation id="6337534724793800597">Filtrați politicile după nume</translation>
+<translation id="6342069812937806050">Adineauri</translation>
 <translation id="6355080345576803305">Modificarea sesiunii publice</translation>
 <translation id="6387478394221739770">Doriți să utilizați funcții Chrome noi și interesante? Încercați canalul nostru beta de la chrome.com/beta.</translation>
 <translation id="6445051938772793705">Țară</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Dispozitiv</translation>
 <translation id="6970216967273061347">Județ</translation>
 <translation id="6973656660372572881">Sunt specificate atât servere proxy fixe, cât și o adresă URL pentru scripturi .pac.</translation>
-<translation id="6980028882292583085">Alertă JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Ai încercat să accesezi <ph name="DOMAIN" />, dar serverul a prezentat un certificat a cărui perioadă de validitate este prea lungă pentru a fi de încredere.</translation>
 <translation id="7087282848513945231">Comitat</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Calea profilului</translation>
 <translation id="7441627299479586546">Subiectul politicii este greșit</translation>
 <translation id="7485870689360869515">Nu s-au găsit date.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatorie</translation>
 <translation id="7542995811387359312">Completarea automată a cardului de credit este dezactivată, deoarece acest formular nu utilizează o conexiune sigură.</translation>
 <translation id="7567204685887185387">Acest server nu a putut dovedi că este <ph name="DOMAIN" />; este posibil ca certificatul său de securitate să fi fost emis fraudulos. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator.</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 9b41466..3b2be91 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Импорт невозможен: недопустимая конфигурация сети.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек вчера. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}one{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # день назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}few{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дня назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}many{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дней назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}other{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дня назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что на компьютере установлено время <ph name="CURRENT_DATE" />. Если оно неправильное, измените его и обновите страницу.}}</translation>
 <translation id="168841957122794586">Сертификат сервера содержит ненадежный криптографический ключ.</translation>
-<translation id="1693754753824026215">Подтвердите действие на <ph name="SITE" /></translation>
 <translation id="1706954506755087368">{1,plural, =1{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу завтра. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}one{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # день. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}few{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # дня. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}many{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # дней. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}other{Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности вступит в силу через # дня. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.}}</translation>
 <translation id="1710259589646384581">ОС</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Закладки <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Почтовый индекс</translation>
 <translation id="6337534724793800597">Фильтровать политики по названию</translation>
+<translation id="6342069812937806050">только что</translation>
 <translation id="6355080345576803305">Сеанс общего доступа (переопределено)</translation>
 <translation id="6387478394221739770">Хотите быть в курсе новинок Chrome? Выберите бета-канал на странице "chrome.com/beta".</translation>
 <translation id="6445051938772793705">Страна</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Устройство</translation>
 <translation id="6970216967273061347">Район</translation>
 <translation id="6973656660372572881">Указаны как фиксированные прокси-серверы, так и URL PAC-скриптов.</translation>
-<translation id="6980028882292583085">Оповещение JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Вы попытались перейти на сайт <ph name="DOMAIN" />, но сервер предоставил не заслуживающий доверия сертификат со слишком долгим сроком действия.</translation>
 <translation id="7087282848513945231">Графство</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Путь к профилю</translation>
 <translation id="7441627299479586546">Неверный субъект политики</translation>
 <translation id="7485870689360869515">Данные не найдены.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Обязательная</translation>
 <translation id="7542995811387359312">Автозаполнение отключено – незащищенное подключение.</translation>
 <translation id="7567204685887185387">Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Его сертификат безопасности мог быть выдан обманным путем. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 4b8244c2..0d2e78ea 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Dátum zostavenia</translation>
 <translation id="1549470594296187301">Ak chcete použiť túto funkciu, musíte povoliť JavaScript.</translation>
 <translation id="1559528461873125649">Neexistuje žiadny takýto súbor ani priečinok</translation>
+<translation id="1629803312968146339">Chcete, aby Chrome uložil túto kartu?</translation>
 <translation id="1640180200866533862">Pravidlá pre používateľa</translation>
 <translation id="1644184664548287040">Konfigurácia siete je neplatná a nepodarilo sa ju importovať.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala včera. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}few{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala pred # dňami. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}many{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala pred # dňom. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}other{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; platnosť jej bezpečnostného certifikátu vypršala pred # dňami. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom. Hodiny vášho počítača sú momentálne nastavené na <ph name="CURRENT_DATE" />. Je tento čas správny? Ak nie, opravte čas na hodinách systému a potom obnovte túto stránku.}}</translation>
 <translation id="168841957122794586">Certifikát servera obsahuje slabý kryptografický kľúč.</translation>
-<translation id="1693754753824026215">Stránka na lokalite <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť od zajtra. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}few{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť o # dni. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}many{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť o # dňa. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}other{Tomuto serveru sa nepodarilo dokázať, že ide o doménu <ph name="DOMAIN" />; jej certifikát by mal začať platiť o # dní. Môže to byť následok nesprávnej konfigurácie alebo napadnutia vášho pripojenia útočníkom.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Rozsah pravidla nie je podporovaný.</translation>
 <translation id="4120075327926916474">Má prehliadač Chrome uložiť informácie o tejto kreditnej karte a použiť ich pri vypĺňaní ďalších webových formulárov?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Chcete, aby Chromium uložil túto kartu?</translation>
 <translation id="4171400957073367226">Nesprávny overovací podpis</translation>
 <translation id="4196861286325780578">&amp;Znova presunúť</translation>
 <translation id="4220128509585149162">Zlyhania</translation>
 <translation id="4250680216510889253">Nie</translation>
 <translation id="4258748452823770588">Chybný podpis</translation>
+<translation id="4268298190799576220">Prehliadaču Chromium sa nepodarilo overiť vašu kartu. Skúste to znova neskôr.</translation>
 <translation id="4269787794583293679">(Žiadne používateľské meno)</translation>
 <translation id="4300246636397505754">Návrhy rodiča</translation>
 <translation id="4325863107915753736">Článok sa nepodarilo nájsť</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">Obdobie platnosti certifikátu servera je príliš dlhé</translation>
 <translation id="6154808779448689242">Vrátený token pravidla sa nezhoduje s aktuálnym tokenom</translation>
 <translation id="6165508094623778733">Viac informácií</translation>
+<translation id="6218753634732582820">Chcete adresu odstrániť z prehliadača Chromium?</translation>
 <translation id="6259156558325130047">&amp;Znova zmeniť poradie</translation>
 <translation id="6263376278284652872">Záložky domény <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Poštový kód</translation>
 <translation id="6337534724793800597">Filtrovať pravidlá podľa mena</translation>
+<translation id="6342069812937806050">Práve teraz</translation>
 <translation id="6355080345576803305">Prepísanie verejnej relácie</translation>
 <translation id="6387478394221739770">Máte záujem o skvelé nové funkcie prehliadača Chrome? Vyskúšajte verziu beta na stránke chrome.com/beta.</translation>
 <translation id="6445051938772793705">Krajina</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685">Vyhľadávanie <ph name="ENGINE" /></translation>
 <translation id="6644283850729428850">Toto pravidlo bolo označené ako zastarané.</translation>
 <translation id="6646897916597483132">Zadajte štvormiestny kód CVC z prednej strany svojej karty</translation>
+<translation id="6671697161687535275">Chcete návrh položky formulára odstrániť z prehliadača Chromium?</translation>
 <translation id="674375294223700098">Neznáma chyba spôsobená certifikátom servera.</translation>
 <translation id="6753269504797312559">Hodnota pravidla</translation>
 <translation id="6831043979455480757">Preložiť</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Zariadenie</translation>
 <translation id="6970216967273061347">Obvod</translation>
 <translation id="6973656660372572881">Určené sú pevne dané servery proxy aj skript PAC webovej adresy.</translation>
-<translation id="6980028882292583085">Upozornenie kódu JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Pokúsili ste sa prejsť do domény <ph name="DOMAIN" />, ale server udelil certifikát, ktorého obdobie platnosti je príliš dlhé, a preto nie je dôveryhodný</translation>
 <translation id="7087282848513945231">Grófstvo</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Cesta profilu</translation>
 <translation id="7441627299479586546">Chybný predmet pravidla</translation>
 <translation id="7485870689360869515">Nenašli sa žiadne údaje.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Povinné</translation>
 <translation id="7542995811387359312">Automatické dopĺňanie údajov o kreditnej karte je zakázané, pretože tento formulár nepoužíva zabezpečené pripojenie.</translation>
 <translation id="7567204685887185387">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, bol zrejme vydaný falošný bezpečnostný certifikát. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Certifikát servera porušuje obmedzenia názvov.</translation>
 <translation id="7600965453749440009">Nikdy neprekladať jazyk <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Hodnota (<ph name="VALUE" />) presahuje povolený rozsah.</translation>
+<translation id="7637571805876720304">Chcete kreditnú kartu odstrániť z prehliadača Chromium?</translation>
 <translation id="7674629440242451245">Máte záujem o skvelé nové funkcie prehliadača Chrome? Vyskúšajte verziu pre vývojárov na stránke chrome.com/dev.</translation>
 <translation id="7752995774971033316">Nespravované</translation>
 <translation id="7761701407923456692">Certifikát servera sa nezhoduje s webovou adresou.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index fedea25a..acf21f3 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Omrežna konfiguracija ni veljavna in je ni mogoče uvoziti.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo včeraj. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}one{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevom. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}two{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevoma. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}few{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevi. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}other{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo je poteklo pred # dnevi. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave. Ura vašega računalnika je trenutno nastavljena na <ph name="CURRENT_DATE" />. Je to videti v redu? Če ni, pravilno nastavite sistemsko uro in nato osvežite stran.}}</translation>
 <translation id="168841957122794586">Potrdilo strežnika vsebuje šibek šifrirni ključ.</translation>
-<translation id="1693754753824026215">Na strani na naslovu <ph name="SITE" /> je navedeno:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo jutrišnji datum. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}one{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dan od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}two{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dneva od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}few{Strežniku ni uspelo dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dni od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}other{Strežniku ni uspelo dokazati, dokazati, da je domena <ph name="DOMAIN" />; njegovo varnostno potrdilo naj bi imelo datum v prihodnosti – # dni od danes. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.}}</translation>
 <translation id="1710259589646384581">Operacijski sistem</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -228,6 +227,7 @@
 <translation id="6263376278284652872">Zaznamki <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Poštna številka</translation>
 <translation id="6337534724793800597">Filtriraj pravilnike po imenu</translation>
+<translation id="6342069812937806050">Pravkar</translation>
 <translation id="6355080345576803305">Preglasitev javne seje</translation>
 <translation id="6387478394221739770">Vas zanimajo super nove funkcije Chroma? Preskusite naš kanal za različice beta na chrome.com/beta.</translation>
 <translation id="6445051938772793705">Država</translation>
@@ -253,7 +253,6 @@
 <translation id="6965978654500191972">Naprava</translation>
 <translation id="6970216967273061347">Okraj</translation>
 <translation id="6973656660372572881">Določeni so stalni strežniki proxy in URL skripta .pac.</translation>
-<translation id="6980028882292583085">Opozorilo JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Poskusili ste odpreti <ph name="DOMAIN" />, vendar je strežnik uporabil potrdilo, ki ima predolgo obdobje veljavnosti, da bi bilo verodostojno.</translation>
 <translation id="7087282848513945231">Okraj</translation>
@@ -276,7 +275,6 @@
 <translation id="7419106976560586862">Pot profila</translation>
 <translation id="7441627299479586546">Napačen subjekt pravilnika</translation>
 <translation id="7485870689360869515">Ni podatkov.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obvezen</translation>
 <translation id="7542995811387359312">Samodejno izpolnjevanje podatkov o kreditni kartici je onemogočeno, ker ta obrazec ne uporablja varne povezave.</translation>
 <translation id="7567204685887185387">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; njegovo varnostno potrdilo je bilo morda izdano z goljufijo. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index 29549e7..50c9847 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Конфигурација мреже је неважећа и не може да се увезе.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао јуче. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}one{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао пре # дана. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}few{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао пре # дана. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}other{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је истекао пре # дана. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу. Сат рачунара је тренутно подешен на <ph name="CURRENT_DATE" />. Да ли је то тачно? Ако није, требало би да исправите сат система и да затим освежите ову страницу.}}</translation>
 <translation id="168841957122794586">Сертификат сервера садржи слаб криптографски кључ.</translation>
-<translation id="1693754753824026215">Страница на <ph name="SITE" /> каже:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Овај сервер не може да докаже да је <ph name="DOMAIN" />; датум његовог безбедносног сертификата је наводно сутрашњи. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}one{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је наводно датиран у будућности (за # дан). Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}few{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је наводно датиран у будућности (за # дана). Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}other{Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је наводно датиран у будућности (за # дана). Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.}}</translation>
 <translation id="1710259589646384581">ОС</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Обележивачи домена <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Поштански број</translation>
 <translation id="6337534724793800597">Филтрирај смернице према називу</translation>
+<translation id="6342069812937806050">Малопре</translation>
 <translation id="6355080345576803305">Замена јавне сесије</translation>
 <translation id="6387478394221739770">Интересују вас нове занимљиве Chrome функције? Испробајте бета канал на chrome.com/beta.</translation>
 <translation id="6445051938772793705">Земља</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Уређај</translation>
 <translation id="6970216967273061347">Дистрикт</translation>
 <translation id="6973656660372572881">Наведени су и фиксни прокси сервери и URL адреса .pac скрипте.</translation>
-<translation id="6980028882292583085">JavaScript обавештење</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Покушали сте да посетите <ph name="DOMAIN" />, али је сервер представио сертификат са периодом важења који је предугачак да би био поуздан.</translation>
 <translation id="7087282848513945231">Округ</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Путања профила</translation>
 <translation id="7441627299479586546">Погрешан субјекат смерница</translation>
 <translation id="7485870689360869515">Нису пронађени подаци.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Обавезно</translation>
 <translation id="7542995811387359312">Онемогућено је аутоматско попуњавање кредитне картице зато што овај образац не користи безбедну везу.</translation>
 <translation id="7567204685887185387">Овај сервер не може да докаже да је <ph name="DOMAIN" />; његов безбедносни сертификат је можда лажно издат. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index c0d0d92d..404d6829 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -28,11 +28,11 @@
 <translation id="1519264250979466059">Programversionsdatum</translation>
 <translation id="1549470594296187301">JavaScript måste aktiveras för att du ska kunna använda den här funktionen.</translation>
 <translation id="1559528461873125649">Filen eller katalogen finns inte</translation>
+<translation id="1629803312968146339">Vill du att Chrome sparar det här kortet?</translation>
 <translation id="1640180200866533862">Användarpolicyer</translation>
 <translation id="1644184664548287040">Nätverkskonfigurationen är ogiltig och kan inte importeras.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat gick ut i går. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad. Dagens datum är <ph name="CURRENT_DATE" /> enligt datorklockan. Går den rätt? I annat fall bör du ställa om datorklockan och sedan uppdatera sidan.}other{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat gick ut för # dagar sedan. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad. Dagens datum är <ph name="CURRENT_DATE" /> enligt datorklockan. Går den rätt? I annat fall bör du ställa om datorklockan och sedan uppdatera sidan.}}</translation>
 <translation id="168841957122794586">Servercertifikatet innehåller en svag kryptografisk nyckel.</translation>
-<translation id="1693754753824026215">Sidan på <ph name="SITE" /> säger:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat uppges börja gälla i morgon. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad.}other{Det gick inte att bevisa att serverns identitet är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat uppges börja gälla om # dagar. Det kan bero på att servern är felkonfigurerad eller att anslutningen har blivit kapad.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -147,11 +147,13 @@
 <translation id="4117700440116928470">Principens omfattning stöds inte.</translation>
 <translation id="4120075327926916474">Vill du att Chrome ska spara kreditkortsuppgifterna vid automatisk ifyllning av webbformulär?</translation>
 <translation id="4148925816941278100">American Express</translation>
+<translation id="4169947484918424451">Vill du att Chromium sparar det här kortet?</translation>
 <translation id="4171400957073367226">Felaktig verifieringssignatur</translation>
 <translation id="4196861286325780578">&amp;Gör om Flytta</translation>
 <translation id="4220128509585149162">Kraschar</translation>
 <translation id="4250680216510889253">Nej</translation>
 <translation id="4258748452823770588">Felaktig signatur</translation>
+<translation id="4268298190799576220">Chromium kunde inte verifiera kortet. Försök igen senare.</translation>
 <translation id="4269787794583293679">(Inget användarnamn)</translation>
 <translation id="4300246636397505754">Föräldratips</translation>
 <translation id="4325863107915753736">Det gick inte att hitta artikeln</translation>
@@ -223,10 +225,12 @@
 <translation id="6151417162996330722">Servercertifikatet har för lång giltighetstid.</translation>
 <translation id="6154808779448689242">Returnerad policytoken matchade inte den aktuella token</translation>
 <translation id="6165508094623778733">Läs mer</translation>
+<translation id="6218753634732582820">Vill du ta bort adressen från Chromium?</translation>
 <translation id="6259156558325130047">&amp;Gör om Ändra ordning</translation>
 <translation id="6263376278284652872">Bokmärken för <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Postnummer</translation>
 <translation id="6337534724793800597">Filtrera policy efter namn</translation>
+<translation id="6342069812937806050">Alldeles nyss</translation>
 <translation id="6355080345576803305">Åsidosätt offentlig session</translation>
 <translation id="6387478394221739770">Är du intresserad av häftiga nya funktioner i Chrome? Pröva vår betakanal på chrome.com/beta.</translation>
 <translation id="6445051938772793705">Land</translation>
@@ -239,6 +243,7 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Sök</translation>
 <translation id="6644283850729428850">Policyn är föråldrad.</translation>
 <translation id="6646897916597483132">Ange den fyrsiffriga CVC-koden från kortets framsida</translation>
+<translation id="6671697161687535275">Vill du ta bort formulärförslaget från Chromium?</translation>
 <translation id="674375294223700098">Fel - okänt servercertifikat.</translation>
 <translation id="6753269504797312559">Policyvärde</translation>
 <translation id="6831043979455480757">Översätt</translation>
@@ -252,7 +257,6 @@
 <translation id="6965978654500191972">Enhet</translation>
 <translation id="6970216967273061347">Distrikt</translation>
 <translation id="6973656660372572881">Både fasta proxyservrar och en webbadress för PAC-skript anges.</translation>
-<translation id="6980028882292583085">JavaScript-varning</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Du försökte nå <ph name="DOMAIN" />, men servern svarade med ett certifikat vars giltighetstid är för lång för att det ska vara trovärdigt.</translation>
 <translation id="7087282848513945231">Grevskap</translation>
@@ -275,7 +279,6 @@
 <translation id="7419106976560586862">Profilsökväg</translation>
 <translation id="7441627299479586546">Felaktigt policyämne</translation>
 <translation id="7485870689360869515">Ingen data hittades.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Obligatorisk</translation>
 <translation id="7542995811387359312">Automatisk ifyllning av kreditkort har inaktiverats eftersom formulärets anslutning inte är säker.</translation>
 <translation id="7567204685887185387">Servern kunde inte bevisa att den är <ph name="DOMAIN" /> eftersom dess säkerhetscertifikat kan ha utfärdats utan behörighet. Detta kan orsakas av en felaktig konfigurering eller att någon spärrar anslutningen.</translation>
@@ -284,6 +287,7 @@
 <translation id="7592362899630581445">Serverns certifikat strider mot namnrestriktionerna.</translation>
 <translation id="7600965453749440009">Översätt aldrig från <ph name="LANGUAGE" /></translation>
 <translation id="7610193165460212391">Värdet är utanför intervallet <ph name="VALUE" />.</translation>
+<translation id="7637571805876720304">Vill du ta bort kreditkortet från Chromium?</translation>
 <translation id="7674629440242451245">Är du intresserad av häftiga nya funktioner i Chrome? Pröva vår utvecklarkanal på chrome.com/dev.</translation>
 <translation id="7752995774971033316">Hanteras inte</translation>
 <translation id="7761701407923456692">Servercertifikatet överensstämmer inte med webbadressen.</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index a33858c..b5c8c8d 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Usanidi wa mtandao ni batili na usingeweza kuingizwa.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kilikwisha muda jana. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako. Saa ya kompyuta kwa sasa imewekwa kuwa <ph name="CURRENT_DATE" />. Je, hiyo ni sahihi? Ikiwa si sahihi, rekebisha saa ya mfumo wako kisha uonyeshe upya ukurasa huu.}other{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kilikwisha muda siku # zilizopita. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako. Saa ya kompyuta kwa sasa imewekwa kuwa <ph name="CURRENT_DATE" />. Je, hiyo ni sahihi? Ikiwa si sahihi, rekebisha saa ya mfumo wako kisha uonyeshe upya ukurasa huu.}}</translation>
 <translation id="168841957122794586">Cheti cha seva kina kitufe dhaifu cha kifichua msimbo.</translation>
-<translation id="1693754753824026215">Ukurasa wa <ph name="SITE" /> unasema:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kitakwisha muda kuanzia kesho. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.}other{Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama kitakwisha muda kuanzia siku # zijazo. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -108,7 +107,7 @@
 <translation id="3228969707346345236">Tafsiri ilishindikana kwa sababu ukurasa tayari upo katika <ph name="LANGUAGE" />.</translation>
 <translation id="3270847123878663523">Tendua Kupanga upya</translation>
 <translation id="3286538390144397061">Zima na uwashe sasa</translation>
-<translation id="333371639341676808">Zuia ukurasa huu usiunde majadiliano zaidi.</translation>
+<translation id="333371639341676808">Zuia ukurasa huu usiulize mswali zaidi.</translation>
 <translation id="3340978935015468852">mipangilio</translation>
 <translation id="3369192424181595722">Hitilafu ya saa</translation>
 <translation id="3369366829301677151">Sasisha na uthibitishe kadi yako ya <ph name="CREDIT_CARD" /></translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Alamisho za <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Msimbo wa posta</translation>
 <translation id="6337534724793800597">Chuja sera kwa jina</translation>
+<translation id="6342069812937806050">Sasa hivi tu</translation>
 <translation id="6355080345576803305">Kipindi cha umma kimebatilishwa</translation>
 <translation id="6387478394221739770">Unavutiwa na vipengee vipya vizuri vya Chrome? Jaribu kituo chetu cha beta katika chrome.com/beta.</translation>
 <translation id="6445051938772793705">Nchi</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Kifaa</translation>
 <translation id="6970216967273061347">Wilaya</translation>
 <translation id="6973656660372572881">Seva zote za proksi thabiti na URL ya hati ya .pac zimebainishwa.</translation>
-<translation id="6980028882292583085">Arifa ya Javascript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Ulijaribu kufikia <ph name="DOMAIN" />, lakini seva ikawasilisha cheti ambacho muda wake sahihi ni mrefu sana wa kuweza kuaminika.</translation>
 <translation id="7087282848513945231">Nchi</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Kijia cha Maelezo mafupi</translation>
 <translation id="7441627299479586546">Kichwa cha sera kisichofaa</translation>
 <translation id="7485870689360869515">Hakuna data iliyopatikana.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Lazima</translation>
 <translation id="7542995811387359312">Mjazo otomatiki wa kadi ya mkopo umelemazwa kwa sababu fomu hii haitumii muunganisho salama.</translation>
 <translation id="7567204685887185387">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; huenda cheti chake cha usalama kimetolewa kwa njia ya ulaghai. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 96d4973..013ddc2 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">பிணைய உள்ளமைவு தவறானது மேலும் அதை இறக்குமதி செய்ய முடியவில்லை.</translation>
 <translation id="1655462015569774233">{1,plural, =1{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் நேற்று காலாவதியானது. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம். உங்கள் கணினியின் கடிகாரம் தற்போது <ph name="CURRENT_DATE" /> என அமைக்கப்பட்டுள்ளது. அது சரியாக இருக்கிறதா? இல்லை என்றால், உங்கள் முறைமையின் கடிகாரத்தைச் சரிசெய்து, பின்னர் இந்தப் பக்கத்தைப் புதுப்பிக்க வேண்டும்.}other{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் # நாட்களுக்கு முன்பு காலாவதியானது. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம். உங்கள் கணினியின் கடிகாரம் தற்போது <ph name="CURRENT_DATE" /> என அமைக்கப்பட்டுள்ளது. அது சரியாக இருக்கிறதா? இல்லை என்றால், உங்கள் முறைமையின் கடிகாரத்தைச் சரிசெய்து, பின்னர் இந்தப் பக்கத்தைப் புதுப்பிக்க வேண்டும்.}}</translation>
 <translation id="168841957122794586">சேவையக சான்றிதழில் வலுவற்ற குறியீட்டாக்க விசை இருக்கிறது.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> இல் உள்ள பக்கம் கூறுவது:</translation>
 <translation id="1706954506755087368">{1,plural, =1{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் நாளை முதலே செல்லுபடியாகும். இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.}other{இந்தச் சேவையகம் தான் <ph name="DOMAIN" /> என்பதை நிரூபிக்க முடியவில்லை; இதன் பாதுகாப்புச் சான்றிதழ் எதிர்காலத்தில் # நாட்களில் ஏற்றுக்கொள்ளப்படும். இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> புக்மார்க்குகள்</translation>
 <translation id="6282194474023008486">அஞ்சல் குறியீடு</translation>
 <translation id="6337534724793800597">பெயரின்படி கொள்கைகளை வடி</translation>
+<translation id="6342069812937806050">இப்போது</translation>
 <translation id="6355080345576803305">பொது அமர்வு மேலெழுதப்பட்டது</translation>
 <translation id="6387478394221739770">புதிய Chrome அம்சங்களில் ஆர்வம் உள்ளதா? chrome.com/beta இல் எங்களுடைய பீட்டா அலைவரிசையை முயற்சிக்கவும்.</translation>
 <translation id="6445051938772793705">நாடு</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">சாதனம்</translation>
 <translation id="6970216967273061347">மாவட்டம்</translation>
 <translation id="6973656660372572881">நிலையான ப்ராக்ஸி சேவையகங்களும் .pac ஸ்கிரிப்ட் URL ஆகிய இரண்டும் குறிப்பிடப்பட்டுள்ளது.</translation>
-<translation id="6980028882292583085">Javascript விழிப்பூட்டல்</translation>
 <translation id="7012363358306927923">சீனா UnionPay</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" />ஐ அடைய முயற்சித்துள்ளீர்கள், சேவையகம் வழங்கிய சான்றிதழ் நம்புவதற்கு சாத்தியமற்ற நீண்ட செல்லுபடிக்காலத்தைக் கொண்டுள்ளது.</translation>
 <translation id="7087282848513945231">மாகாணம்</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">சுயவிவரப் பாதை</translation>
 <translation id="7441627299479586546">தவறான கொள்கைத் தலைப்பு</translation>
 <translation id="7485870689360869515">தரவு எதுவும் இல்லை.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">கட்டாயம்</translation>
 <translation id="7542995811387359312">இந்தப் படிவம் பாதுகாப்பான இணைப்பைப் பயன்படுத்தாத காரணத்தால், தானியங்கு கடன் அட்டை நிரப்புதல் முடக்கப்பட்டிருக்கிறது.</translation>
 <translation id="7567204685887185387">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழில் மோசடி செய்யப்பட்டிருக்கலாம். இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index efd9445..33135df 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">నెట్‌వర్క్ కాన్ఫిగరేషన్ చెల్లదు మరియు దిగుమతి చేయడం సాధ్యం కాదు.</translation>
 <translation id="1655462015569774233">{1,plural, =1{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం గడువు నిన్న ముగిసింది. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్‌కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు. మీ కంప్యూటర్ గడియారం ప్రస్తుతం <ph name="CURRENT_DATE" />కి సెట్ చేయబడింది. అది సరిగ్గా ఉందా? సరిగ్గా లేకుంటే, మీరు సిస్టమ్ గడియారాన్ని సరిచేసి, ఆపై ఈ పేజీని రీఫ్రెష్ చేయాలి.}other{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం గడువు # రోజుల క్రితం ముగిసింది. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్‌కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు. మీ కంప్యూటర్ గడియారం ప్రస్తుతం <ph name="CURRENT_DATE" />కి సెట్ చేయబడింది. అది సరిగ్గా ఉందా? సరిగ్గా లేకుంటే, మీరు సిస్టమ్ గడియారాన్ని సరిచేసి, ఆపై ఈ పేజీని రీఫ్రెష్ చేయాలి.}}</translation>
 <translation id="168841957122794586">సర్వర్ ప్రమాణపత్రం బలహీన క్రిప్టోగ్రాఫిక్ కీని కలిగి ఉంది.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> వద్ద గల పేజీ చెప్పింది:</translation>
 <translation id="1706954506755087368">{1,plural, =1{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం రేపటిది కావచ్చు. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్‌కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు.}other{ఈ సర్వర్ ఇది <ph name="DOMAIN" /> అని నిరూపించలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం భవిష్యత్తులో # రోజుల తదుపరిది కావచ్చు. తప్పుగా కాన్ఫిగర్ చేసినందున లేదా దాడిచేసేవారు మీ కనెక్షన్‌కు అంతరాయం కలిగించినందున ఇలా జరిగి ఉండవచ్చు.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> బుక్‌మార్క్‌లు</translation>
 <translation id="6282194474023008486">పోస్టల్ కోడ్</translation>
 <translation id="6337534724793800597">పేరు ద్వారా విధానాలను ఫిల్టర్ చేయి</translation>
+<translation id="6342069812937806050">ఇప్పుడే</translation>
 <translation id="6355080345576803305">పబ్లిక్ సెషన్ భర్తీ</translation>
 <translation id="6387478394221739770">అద్భుతమైన క్రొత్త Chrome లక్షణాల పట్ల ఆసక్తిగా ఉన్నారా? chrome.com/betaలో మా బీటా ఛానెల్‌ను ప్రయత్నించండి.</translation>
 <translation id="6445051938772793705">దేశం</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">పరికరం</translation>
 <translation id="6970216967273061347">జిల్లా</translation>
 <translation id="6973656660372572881">రెండు స్థిర ప్రాక్సీ సర్వర్లు మరియు ఒక .pac స్క్రిప్ట్ URL పేర్కొనబడ్డాయి.</translation>
-<translation id="6980028882292583085">Javascript హెచ్చరిక</translation>
 <translation id="7012363358306927923">చైనా యూనియన్ పే</translation>
 <translation id="7050187094878475250">మీరు <ph name="DOMAIN" />ని చేరుకోవడానికి ప్రయత్నించారు, కానీ సర్వర్ అందించిన ప్రమాణపత్రం విశ్వసించలేనంత ఎక్కువ చెల్లుబాటు వ్యవధిని కలిగి ఉంది.</translation>
 <translation id="7087282848513945231">కౌంటి</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">ప్రొఫైల్ మార్గం</translation>
 <translation id="7441627299479586546">చెల్లని విధాన విషయం</translation>
 <translation id="7485870689360869515">డేటా కనుగొనబడలేదు.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">తప్పనిసరి</translation>
 <translation id="7542995811387359312">ఈ ఫారమ్ సురక్షిత కనెక్షన్‌ని ఉపయోగించనందున స్వయంచాలకంగా క్రెడిట్ కార్డ్ పూర్తి చెయ్యడం ఆపివేయబడింది.</translation>
 <translation id="7567204685887185387">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రం మోసపూరితంగా జారీ అయ్యి ఉండవచ్చు. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడిచేసే వ్యక్తి మీ కనెక్షన్‌కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 874cfac..6b9d31c 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">การกำหนดค่าเครือข่ายไม่ถูกต้องและไม่สามารถนำเข้า</translation>
 <translation id="1655462015569774233">{1,plural, =1{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยหมดอายุไปเมื่อวานนี้ โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ ขณะนี้นาฬิกาของคุณตั้งค่าไว้ที่วันที่ <ph name="CURRENT_DATE" /> การตั้งค่านี้ถูกต้องไหม หากไม่ถูกต้อง คุณควรแก้ไขนาฬิกาของระบบและรีเฟรชหน้านี้}other{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยหมดอายุไปเมื่อ # วันที่ผ่านมา โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ ขณะนี้นาฬิกาของคุณตั้งค่าไว้ที่วันที่ <ph name="CURRENT_DATE" /> การตั้งค่านี้ถูกต้องไหม หากไม่ถูกต้อง คุณควรแก้ไขนาฬิกาของระบบและรีเฟรชหน้านี้}}</translation>
 <translation id="168841957122794586">ใบรับรองของเซิร์ฟเวอร์มีคีย์การเข้ารหัสที่ไม่รัดกุม</translation>
-<translation id="1693754753824026215">หน้าเว็บที่ <ph name="SITE" /> แจ้งว่า:</translation>
 <translation id="1706954506755087368">{1,plural, =1{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยควรจะเริ่มใช้งานได้ตั้งแต่วันพรุ่งนี้ โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ}other{เซิร์ฟเวอร์นี้พิสูจน์ไม่ได้ว่าเป็น <ph name="DOMAIN" /> เพราะใบรับรองความปลอดภัยควรจะเริ่มใช้งานได้ในอีก # วันข้างหน้า โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ}}</translation>
 <translation id="1710259589646384581">ระบบปฏิบัติการ</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">บุ๊กมาร์ก <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">รหัสไปรษณีย์</translation>
 <translation id="6337534724793800597">กรองนโยบายตามชื่อ</translation>
+<translation id="6342069812937806050">เพิ่งเสร็จ</translation>
 <translation id="6355080345576803305">การลบล้างเซสชันสาธารณะ</translation>
 <translation id="6387478394221739770">หากสนใจในคุณลักษณะสุดเจ๋งของ Chrome ใหม่ ลองใช้เวอร์ชันเบต้าของเราที่ chrome.com/beta</translation>
 <translation id="6445051938772793705">ประเทศ</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">อุปกรณ์</translation>
 <translation id="6970216967273061347">เขต</translation>
 <translation id="6973656660372572881">มีการระบุทั้งพร็อกซีเซิร์ฟเวอร์แบบคงที่และ URL สคริปต์ .pac ไว้</translation>
-<translation id="6980028882292583085">แจ้งเตือน JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">คุณพยายามเข้าถึง <ph name="DOMAIN" /> แต่เซิร์ฟเวอร์ได้แสดงใบรับรองที่มีระยะเวลาที่สามารถใช้ได้นานเกินกว่าที่จะเชื่อถือได้</translation>
 <translation id="7087282848513945231">อำเภอ</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">เส้นทางโปรไฟล์</translation>
 <translation id="7441627299479586546">หัวเรื่องนโยบายไม่ถูกต้อง</translation>
 <translation id="7485870689360869515">ไม่พบข้อมูล</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">จำเป็น</translation>
 <translation id="7542995811387359312">การป้อนหมายเลขบัตรเครดิตอัตโนมัติถูกปิดใช้งานเนื่องจากฟอร์มนี้ไม่ได้ใช้การเชื่อมต่อที่ปลอดภัย</translation>
 <translation id="7567204685887185387">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะอาจมีการออกใบรับรองความปลอดภัยปลอม โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index aaedbf44..b89fa753 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Ağ yapılandırması geçersiz, dolayısıyla içe aktarılamadı.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasının süresi dün sona erdi. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir. Bilgisayarınızın saati geçerli olarak <ph name="CURRENT_DATE" /> tarihine ayarlı. Bu ayar doğru görünüyor mu? Değilse, sisteminizin saatini düzeltmeli ve sonra bu sayfayı yenilemelisiniz.}other{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikası # gün önce sona erdi. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir. Bilgisayarınızın saati geçerli olarak <ph name="CURRENT_DATE" /> tarihine ayarlı. Bu ayar doğru görünüyor mu? Değilse, sisteminizin saatini düzeltmeli ve sonra bu sayfayı yenilemelisiniz.}}</translation>
 <translation id="168841957122794586">Sunucu sertifikasında zayıf bir şifreleme anahtarı var.</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> web sitesindeki sayfanın mesajı:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasının alınma tarihinin yarın olduğu iddia ediliyor. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir.}other{Bu sunucu, <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikasının alınma tarihinin # gün sonra olduğu iddia ediliyor. Bu durum, bir yanlış yapılandırmadan veya bağlantınıza müdahale eden bir saldırgandan kaynaklanıyor olabilir.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> yer işaretleri</translation>
 <translation id="6282194474023008486">Posta kodu</translation>
 <translation id="6337534724793800597">Politikalara ada göre filtre uygula</translation>
+<translation id="6342069812937806050">Az önce</translation>
 <translation id="6355080345576803305">Herkese açık oturumu geçersiz kılma</translation>
 <translation id="6387478394221739770">Chrome'daki etkileyici, yeni özellikler ilginizi çekiyor mu? chrome.com/beta adresinden beta kanalımızı deneyin.</translation>
 <translation id="6445051938772793705">Ülke</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Cihaz</translation>
 <translation id="6970216967273061347">Bölge</translation>
 <translation id="6973656660372572881">Hem sabit proxy sunucular hem de bir .pac komut dosyası URL'si belirtildi.</translation>
-<translation id="6980028882292583085">JavaScript Uyarısı</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> alan adına erişmeyi denediniz, ancak sunucu, geçerlilik dönemi güvenilir olmayacak kadar uzun olan bir sertifika sundu.</translation>
 <translation id="7087282848513945231">İlçe</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Profil Yolu</translation>
 <translation id="7441627299479586546">Politika konusu yanlış</translation>
 <translation id="7485870689360869515">Hiçbir veri bulunamadı.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Zorunlu</translation>
 <translation id="7542995811387359312">Bu form güvenli bağlantı kullanmadığından kredi kartı bilgilerini otomatik doldurma özelliği devre dışı bırakıldı.</translation>
 <translation id="7567204685887185387">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Güvenlik sertifikası hileli bir şekilde yayınlanmış olabilir. Bu durum, bir yanlış yapılandırmadan veya bağlantıya müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index f362201e..8e37dff 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Конфігурація мережі недійсна та не може імпортуватися.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти учора. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}one{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # день тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}few{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # дні тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}many{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # днів тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}other{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат перестав діяти # дня тому. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані. На годиннику вашого комп’ютера зараз <ph name="CURRENT_DATE" />. Якщо дата неправильна, налаштуйте системний годинник і оновіть цю сторінку.}}</translation>
 <translation id="168841957122794586">Сертифікат сервера містить слабкий криптографічний ключ.</translation>
-<translation id="1693754753824026215">Повідомлення від сторінки <ph name="SITE" />:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти завтра. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}one{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # день. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}few{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # дні. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}many{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # днів. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}other{Не вдалося підтвердити, що це сервер <ph name="DOMAIN" />. Його сертифікат безпеки почне діяти через # дня. Можливо, сервер налаштовано неправильно або хтось намагається перехопити ваші дані.}}</translation>
 <translation id="1710259589646384581">ОС</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Закладки <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Поштовий код</translation>
 <translation id="6337534724793800597">Фільтрувати правила за назвою</translation>
+<translation id="6342069812937806050">Лише зараз</translation>
 <translation id="6355080345576803305">Заміна загальнодоступного сеансу</translation>
 <translation id="6387478394221739770">Хочете спробувати нові цікаві функції Chrome? Завантажте бета-версію зі сторінки chrome.com/beta.</translation>
 <translation id="6445051938772793705">Країна</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Пристрій</translation>
 <translation id="6970216967273061347">Район або округ</translation>
 <translation id="6973656660372572881">Указано фіксовані проксі-сервери та URL-адреса сценарію .pac.</translation>
-<translation id="6980028882292583085">Сповіщення JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Ви намагалися зв’язатися з доменом <ph name="DOMAIN" />, але сервер надав сертифікат із задовгим терміном дії.</translation>
 <translation id="7087282848513945231">Округ або графство</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Шлях до профілю</translation>
 <translation id="7441627299479586546">Неправильна тема правила</translation>
 <translation id="7485870689360869515">Даних не знайдено.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Обов’язкове</translation>
 <translation id="7542995811387359312">Автоматичне заповнення кредитної картки вимкнено, оскільки ця форма не використовує безпечне з'єднання.</translation>
 <translation id="7567204685887185387">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. Можливо, його сертифікат безпеки видали шахраї. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index 3772c72..c531702 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">Cấu hình mạng không hợp lệ và không thể nhập được.</translation>
 <translation id="1655462015569774233">{1,plural, =1{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này đã hết hạn hôm qua. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn. Đồng hồ máy tính của bạn hiện được đặt là <ph name="CURRENT_DATE" />. Ngày này có đúng không? Nếu không đúng, bạn phải sửa lại đồng hồ của hệ thống rồi làm mới trang này.}other{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này đã hết hạn cách đây # ngày. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn. Đồng hồ máy tính của bạn hiện được đặt là <ph name="CURRENT_DATE" />. Ngày này có đúng không? Nếu không đúng, bạn phải sửa lại đồng hồ của hệ thống rồi làm mới trang này.}}</translation>
 <translation id="168841957122794586">Chứng chỉ máy chủ chứa khóa mật mã yếu.</translation>
-<translation id="1693754753824026215">Trang trên <ph name="SITE" /> cho biết:</translation>
 <translation id="1706954506755087368">{1,plural, =1{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này được đề từ ngày mai. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.}other{Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này được đề # ngày trong tương lai. Điều này có thể do cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.}}</translation>
 <translation id="1710259589646384581">OS</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872">Dấu trang trên <ph name="DOMAIN" /></translation>
 <translation id="6282194474023008486">Mã bưu chính</translation>
 <translation id="6337534724793800597">Lọc chính sách theo tên</translation>
+<translation id="6342069812937806050">Vừa mới</translation>
 <translation id="6355080345576803305">Ghi đè phiên công khai</translation>
 <translation id="6387478394221739770">Bạn quan tâm đến các tính năng mới thú vị của Chrome? Hãy dùng thử kênh thử nghiệm beta của chúng tôi tại chrome.com/beta.</translation>
 <translation id="6445051938772793705">Quốc gia</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">Thiết bị</translation>
 <translation id="6970216967273061347">Quận</translation>
 <translation id="6973656660372572881">Cả hai máy chủ proxy cố định và URL tập lệnh .pac đều được chỉ định.</translation>
-<translation id="6980028882292583085">Cảnh báo JavaScript</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
 <translation id="7050187094878475250">Bạn đã cố gắng truy cập <ph name="DOMAIN" /> nhưng máy chủ đã hiển thị chứng chỉ có thời gian hiệu lực quá dài để có thể tin cậy.</translation>
 <translation id="7087282848513945231">Hạt</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">Đường dẫn cấu hình</translation>
 <translation id="7441627299479586546">Chủ đề chính sách sai</translation>
 <translation id="7485870689360869515">Không tìm thấy dữ liệu.</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">Bắt buộc</translation>
 <translation id="7542995811387359312">Tính năng tự động điền thẻ tín dụng đã bị vô hiệu hóa vì biểu mẫu này không sử dụng kết nối an toàn.</translation>
 <translation id="7567204685887185387">Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này có thể đã bị gian lận khi phát hành. Điều này có thể do định cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index 82780e6..beeac0a 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">网络配置无效,无法导入。</translation>
 <translation id="1655462015569774233">{1,plural, =1{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书已在昨天过期。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。计算机的时钟目前已设为 <ph name="CURRENT_DATE" />,该设置是否正确?如果不正确,请更正系统的时钟,然后刷新此页面。}other{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书已在 # 天前过期。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。计算机的时钟目前已设为 <ph name="CURRENT_DATE" />,该设置是否正确?如果不正确,请更正系统的时钟,然后刷新此页面。}}</translation>
 <translation id="168841957122794586">服务器证书包含弱加密密钥。</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> 上的网页显示:</translation>
 <translation id="1706954506755087368">{1,plural, =1{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书明天才会生效。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。}other{此服务器无法证明它是 <ph name="DOMAIN" />;其安全证书 # 天后才会生效。出现此问题的原因可能是配置有误,或有攻击者拦截了您的连接。}}</translation>
 <translation id="1710259589646384581">操作系统</translation>
 <translation id="1734864079702812349">美国运通卡</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> 书签</translation>
 <translation id="6282194474023008486">邮编</translation>
 <translation id="6337534724793800597">按名称过滤政策</translation>
+<translation id="6342069812937806050">刚刚</translation>
 <translation id="6355080345576803305">覆盖公开会话</translation>
 <translation id="6387478394221739770">想试试超酷的 Chrome 新功能?欢迎访问 chrome.com/beta,试用我们的测试版!</translation>
 <translation id="6445051938772793705">国家/地区</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">设备</translation>
 <translation id="6970216967273061347">区</translation>
 <translation id="6973656660372572881">固定代理服务器和 .pac 脚本网址均已指定。</translation>
-<translation id="6980028882292583085">JavaScript 提醒</translation>
 <translation id="7012363358306927923">中国银联</translation>
 <translation id="7050187094878475250">您尝试访问 <ph name="DOMAIN" />,但服务器提供的证书不可信(有效期过长)。</translation>
 <translation id="7087282848513945231">县/郡</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">个人资料路径</translation>
 <translation id="7441627299479586546">策略主题有误</translation>
 <translation id="7485870689360869515">找不到数据。</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">强制</translation>
 <translation id="7542995811387359312">由于该表单不使用安全连接,因此自动填写信用卡信息的功能已停用。</translation>
 <translation id="7567204685887185387">此服务器无法证明它是<ph name="DOMAIN" />;其安全证书可能是由骗子发出的。出现此问题的原因可能是配置有误或您的连接被拦截了。</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 1e42d34..d6f128d 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -32,7 +32,6 @@
 <translation id="1644184664548287040">網路設定無效,無法匯入。</translation>
 <translation id="1655462015569774233">{1,plural, =1{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證已在昨天過期。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。您電腦的時鐘目前設為 <ph name="CURRENT_DATE" />,這是正確的時間嗎?如果不是的話,請更新系統時鐘,然後重新整理這個網頁。}other{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證已在 # 天前過期。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。您電腦的時鐘目前設為 <ph name="CURRENT_DATE" />,這是正確的時間嗎?如果不是的話,請更新系統時鐘,然後重新整理這個網頁。}}</translation>
 <translation id="168841957122794586">伺服器憑證含有防護力薄弱的加密編譯金鑰。</translation>
-<translation id="1693754753824026215"><ph name="SITE" /> 的網頁顯示:</translation>
 <translation id="1706954506755087368">{1,plural, =1{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證預定明天才生效。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。}other{這個伺服器無法證明所在網域是 <ph name="DOMAIN" />;伺服器的安全性憑證預定 # 天後才生效。這可能是因為設定錯誤,或是有攻擊者攔截您的連線。}}</translation>
 <translation id="1710259589646384581">作業系統</translation>
 <translation id="1734864079702812349">Amex</translation>
@@ -227,6 +226,7 @@
 <translation id="6263376278284652872"><ph name="DOMAIN" /> 書籤</translation>
 <translation id="6282194474023008486">郵遞區號</translation>
 <translation id="6337534724793800597">依名稱篩選政策</translation>
+<translation id="6342069812937806050">剛剛</translation>
 <translation id="6355080345576803305">公開工作階段覆寫</translation>
 <translation id="6387478394221739770">想搶先試用酷炫的 Chrome 新功能嗎?請前往 chrome.com/beta 安裝測試版。</translation>
 <translation id="6445051938772793705">國家/地區</translation>
@@ -252,7 +252,6 @@
 <translation id="6965978654500191972">裝置</translation>
 <translation id="6970216967273061347">區</translation>
 <translation id="6973656660372572881">已指定固定的 Proxy 伺服器和 .pac 指令碼網址。</translation>
-<translation id="6980028882292583085">JavaScript 通知</translation>
 <translation id="7012363358306927923">中國銀聯</translation>
 <translation id="7050187094878475250">您嘗試連線至 <ph name="DOMAIN" />,但伺服器提供的憑證有效期限太長,因此難以信任。</translation>
 <translation id="7087282848513945231">郡</translation>
@@ -275,7 +274,6 @@
 <translation id="7419106976560586862">設定檔路徑</translation>
 <translation id="7441627299479586546">政策主體有誤</translation>
 <translation id="7485870689360869515">找不到任何資料。</translation>
-<translation id="7521387064766892559">JavaScript</translation>
 <translation id="7537536606612762813">強制</translation>
 <translation id="7542995811387359312">由於這個表單並未採用加密連線方式,所以信用卡自動填入功能已停用。</translation>
 <translation id="7567204685887185387">伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證是以欺詐方式發行。這可能是因為設定錯誤,或有攻擊者攔截您的連線所致。</translation>
diff --git a/components/toolbar/OWNERS b/components/toolbar/OWNERS
new file mode 100644
index 0000000..bf426d6
--- /dev/null
+++ b/components/toolbar/OWNERS
@@ -0,0 +1 @@
+pkasting@chromium.org
diff --git a/components/toolbar/toolbar_model.h b/components/toolbar/toolbar_model.h
index b592f300..dc67fc7 100644
--- a/components/toolbar/toolbar_model.h
+++ b/components/toolbar/toolbar_model.h
@@ -11,6 +11,10 @@
 #include "base/strings/string16.h"
 #include "url/gurl.h"
 
+namespace gfx {
+enum class VectorIconId;
+}
+
 namespace net {
 class X509Certificate;
 }
@@ -64,6 +68,9 @@
   // user is editing; see OmniboxView::GetIcon().
   virtual int GetIcon() const = 0;
 
+  // Like GetIcon(), but gets the vector asset ID.
+  virtual gfx::VectorIconId GetVectorIcon() const = 0;
+
   // Returns the name of the EV cert holder.  This returns an empty string if
   // the security level is not EV_SECURE.
   virtual base::string16 GetEVCertName() const = 0;
diff --git a/components/ui/zoom/page_zoom.cc b/components/ui/zoom/page_zoom.cc
index 7d9670c..3f4470f 100644
--- a/components/ui/zoom/page_zoom.cc
+++ b/components/ui/zoom/page_zoom.cc
@@ -83,7 +83,7 @@
 
   if (zoom == content::PAGE_ZOOM_RESET) {
     zoom_controller->SetZoomLevel(default_zoom_level);
-    web_contents->ResetPageScale();
+    web_contents->SetPageScale(1.f);
     content::RecordAction(UserMetricsAction("ZoomNormal"));
     return;
   }
diff --git a/components/variations/variations_seed_store.cc b/components/variations/variations_seed_store.cc
index edd3df3..84dca7e 100644
--- a/components/variations/variations_seed_store.cc
+++ b/components/variations/variations_seed_store.cc
@@ -140,6 +140,21 @@
   return SEED_DATE_SAME_DAY;
 }
 
+#if defined(OS_ANDROID)
+enum FirstRunResult {
+  FIRST_RUN_SEED_IMPORT_SUCCESS,
+  FIRST_RUN_SEED_IMPORT_FAIL_NO_CALLBACK,
+  FIRST_RUN_SEED_IMPORT_FAIL_NO_FIRST_RUN_SEED,
+  FIRST_RUN_SEED_IMPORT_FAIL_STORE_FAILED,
+  FIRST_RUN_RESULT_ENUM_SIZE,
+};
+
+void RecordFirstRunResult(FirstRunResult result) {
+  UMA_HISTOGRAM_ENUMERATION("Variations.FirstRunResult", result,
+                            FIRST_RUN_RESULT_ENUM_SIZE);
+}
+#endif  // OS_ANDROID
+
 }  // namespace
 
 VariationsSeedStore::VariationsSeedStore(PrefService* local_state)
@@ -344,17 +359,18 @@
 #if defined(OS_ANDROID)
 void VariationsSeedStore::ImportFirstRunJavaSeed() {
   DVLOG(1) << "Importing first run seed from Java preferences.";
+  if (get_variations_first_run_seed_.is_null()) {
+    RecordFirstRunResult(FIRST_RUN_SEED_IMPORT_FAIL_NO_CALLBACK);
+    return;
+  }
+
   std::string seed_data;
   std::string seed_signature;
   std::string seed_country;
-  if (!get_variations_first_run_seed_.is_null()) {
-    get_variations_first_run_seed_.Run(&seed_data, &seed_signature,
-                                       &seed_country);
-  }
-
+  get_variations_first_run_seed_.Run(&seed_data, &seed_signature,
+                                     &seed_country);
   if (seed_data.empty()) {
-    // TODO(agulenko): add a new UMA histogram for the state of failing
-    // to import seed from Java preferences during Chrome first run.
+    RecordFirstRunResult(FIRST_RUN_SEED_IMPORT_FAIL_NO_FIRST_RUN_SEED);
     return;
   }
 
@@ -364,10 +380,12 @@
   // TODO(agulenko): Support gzip compressed seed.
   if (!StoreSeedData(seed_data, seed_signature, seed_country, current_time,
                      false, false, nullptr)) {
+    RecordFirstRunResult(FIRST_RUN_SEED_IMPORT_FAIL_STORE_FAILED);
     LOG(WARNING) << "First run variations seed is invalid.";
     return;
   }
   // TODO(agulenko): Clear Java prefs.
+  RecordFirstRunResult(FIRST_RUN_SEED_IMPORT_SUCCESS);
 }
 #endif  // OS_ANDROID
 
diff --git a/components/web_view/frame_apptest.cc b/components/web_view/frame_apptest.cc
index 5291ebb39..501a4d58 100644
--- a/components/web_view/frame_apptest.cc
+++ b/components/web_view/frame_apptest.cc
@@ -371,7 +371,8 @@
   void SetUp() override {
     ApplicationTestBase::SetUp();
 
-    mus::CreateSingleWindowTreeHost(application_impl(), this, &host_, nullptr);
+    mus::CreateSingleWindowTreeHost(application_impl(), this, &host_, nullptr,
+                                    nullptr);
 
     ASSERT_TRUE(DoRunLoopWithTimeout());
     std::swap(window_manager_, most_recent_connection_);
diff --git a/components/web_view/test_runner/test_runner_application_delegate.cc b/components/web_view/test_runner/test_runner_application_delegate.cc
index 3e6c8a7..6bd333f 100644
--- a/components/web_view/test_runner/test_runner_application_delegate.cc
+++ b/components/web_view/test_runner/test_runner_application_delegate.cc
@@ -66,7 +66,7 @@
     NOTREACHED() << "Test environment could not be properly set up for blink.";
   }
   app_ = app;
-  mus::CreateSingleWindowTreeHost(app_, this, &host_, nullptr);
+  mus::CreateSingleWindowTreeHost(app_, this, &host_, nullptr, nullptr);
 }
 
 bool TestRunnerApplicationDelegate::ConfigureIncomingConnection(
diff --git a/components/web_view/web_view_impl.cc b/components/web_view/web_view_impl.cc
index cf9e263..45063e8c 100644
--- a/components/web_view/web_view_impl.cc
+++ b/components/web_view/web_view_impl.cc
@@ -47,8 +47,8 @@
       binding_(this, request.Pass()),
       root_(nullptr),
       content_(nullptr),
-      navigation_controller_(this),
-      find_controller_(this) {
+      find_controller_(this),
+      navigation_controller_(this) {
   if (EnableRemoteDebugging())
     devtools_agent_.reset(new FrameDevToolsAgent(app_, this));
   OnDidNavigate();
diff --git a/components/web_view/web_view_impl.h b/components/web_view/web_view_impl.h
index 569ca5c..085b66d2 100644
--- a/components/web_view/web_view_impl.h
+++ b/components/web_view/web_view_impl.h
@@ -119,6 +119,8 @@
   mojo::StrongBinding<WebView> binding_;
   mus::Window* root_;
   mus::Window* content_;
+  // |find_controller_| is referenced by frame_tree_'s frames at destruction.
+  FindController find_controller_;
   scoped_ptr<FrameTree> frame_tree_;
 
   // When LoadRequest() is called a PendingWebViewLoad is created to wait for
@@ -130,8 +132,6 @@
 
   NavigationController navigation_controller_;
 
-  FindController find_controller_;
-
   DISALLOW_COPY_AND_ASSIGN(WebViewImpl);
 };
 
diff --git a/content/browser/android/OWNERS b/content/browser/android/OWNERS
index 70bfe8db..c6293207 100644
--- a/content/browser/android/OWNERS
+++ b/content/browser/android/OWNERS
@@ -1,3 +1,6 @@
 skyostil@chromium.org
 tedchoc@chromium.org
 yfriedman@chromium.org
+
+per-file synchronous_compositor_*.h=boliu@chromium.org
+per-file synchronous_compositor_*.cc=boliu@chromium.org
diff --git a/content/browser/android/url_request_content_job.cc b/content/browser/android/url_request_content_job.cc
index 1bcbf210..6e661a2 100644
--- a/content/browser/android/url_request_content_job.cc
+++ b/content/browser/android/url_request_content_job.cc
@@ -11,6 +11,7 @@
 #include "base/task_runner.h"
 #include "net/base/file_stream.h"
 #include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
 #include "net/http/http_util.h"
 #include "net/url_request/url_request_error_job.h"
 #include "url/gurl.h"
@@ -33,7 +34,6 @@
       content_path_(content_path),
       stream_(new net::FileStream(content_task_runner)),
       content_task_runner_(content_task_runner),
-      range_parse_result_(net::OK),
       remaining_bytes_(0),
       io_pending_(false),
       weak_ptr_factory_(this) {}
@@ -56,28 +56,43 @@
   net::URLRequestJob::Kill();
 }
 
-int URLRequestContentJob::ReadRawData(net::IOBuffer* dest, int dest_size) {
+bool URLRequestContentJob::ReadRawData(net::IOBuffer* dest,
+                                       int dest_size,
+                                       int* bytes_read) {
   DCHECK_GT(dest_size, 0);
+  DCHECK(bytes_read);
   DCHECK_GE(remaining_bytes_, 0);
 
   if (remaining_bytes_ < dest_size)
-    dest_size = remaining_bytes_;
+    dest_size = static_cast<int>(remaining_bytes_);
 
   // If we should copy zero bytes because |remaining_bytes_| is zero, short
   // circuit here.
-  if (!dest_size)
-    return 0;
+  if (!dest_size) {
+    *bytes_read = 0;
+    return true;
+  }
 
-  int rv = stream_->Read(dest, dest_size,
-                         base::Bind(&URLRequestContentJob::DidRead,
-                                    weak_ptr_factory_.GetWeakPtr()));
+  int rv =
+      stream_->Read(dest, dest_size, base::Bind(&URLRequestContentJob::DidRead,
+                                                weak_ptr_factory_.GetWeakPtr(),
+                                                make_scoped_refptr(dest)));
+  if (rv >= 0) {
+    // Data is immediately available.
+    *bytes_read = rv;
+    remaining_bytes_ -= rv;
+    DCHECK_GE(remaining_bytes_, 0);
+    return true;
+  }
+
+  // Otherwise, a read error occured.  We may just need to wait...
   if (rv == net::ERR_IO_PENDING) {
     io_pending_ = true;
-  } else if (rv > 0) {
-    remaining_bytes_ -= rv;
+    SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+  } else {
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, rv));
   }
-  DCHECK_GE(remaining_bytes_, 0);
-  return rv;
+  return false;
 }
 
 bool URLRequestContentJob::IsRedirectResponse(GURL* location,
@@ -100,16 +115,15 @@
   if (!headers.GetHeader(net::HttpRequestHeaders::kRange, &range_header))
     return;
 
-  // Currently this job only cares about the Range header. Note that validation
-  // is deferred to DidOpen(), because NotifyStartError is not legal to call
-  // since the job has not started.
+  // We only care about "Range" header here.
   std::vector<net::HttpByteRange> ranges;
   if (net::HttpUtil::ParseRangeHeader(range_header, &ranges)) {
     if (ranges.size() == 1) {
       byte_range_ = ranges[0];
     } else {
       // We don't support multiple range requests.
-      range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
+      NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                       net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     }
   }
 }
@@ -146,20 +160,13 @@
 
 void URLRequestContentJob::DidOpen(int result) {
   if (result != net::OK) {
-    NotifyStartError(
-        net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
-    return;
-  }
-
-  if (range_parse_result_ != net::OK) {
-    NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                           range_parse_result_));
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
     return;
   }
 
   if (!byte_range_.ComputeBounds(meta_info_.content_size)) {
-    NotifyStartError(net::URLRequestStatus(
-        net::URLRequestStatus::FAILED, net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                     net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     return;
   }
 
@@ -186,8 +193,8 @@
 
 void URLRequestContentJob::DidSeek(int64 result) {
   if (result != byte_range_.first_byte_position()) {
-    NotifyStartError(net::URLRequestStatus(
-        net::URLRequestStatus::FAILED, net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                     net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     return;
   }
 
@@ -195,16 +202,24 @@
   NotifyHeadersComplete();
 }
 
-void URLRequestContentJob::DidRead(int result) {
-  DCHECK(io_pending_);
-  io_pending_ = false;
-
+void URLRequestContentJob::DidRead(scoped_refptr<net::IOBuffer> buf,
+                                   int result) {
   if (result > 0) {
+    SetStatus(net::URLRequestStatus());  // Clear the IO_PENDING status
     remaining_bytes_ -= result;
     DCHECK_GE(remaining_bytes_, 0);
   }
 
-  ReadRawDataComplete(result);
+  DCHECK(io_pending_);
+  io_pending_ = false;
+
+  if (result == 0) {
+    NotifyDone(net::URLRequestStatus());
+  } else if (result < 0) {
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+  }
+
+  NotifyReadComplete(result);
 }
 
 }  // namespace content
diff --git a/content/browser/android/url_request_content_job.h b/content/browser/android/url_request_content_job.h
index dad9fbfc..5d3d9336 100644
--- a/content/browser/android/url_request_content_job.h
+++ b/content/browser/android/url_request_content_job.h
@@ -12,7 +12,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
-#include "net/base/net_errors.h"
 #include "net/http/http_byte_range.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_job.h"
@@ -43,7 +42,7 @@
   // net::URLRequestJob:
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool IsRedirectResponse(GURL* location, int* http_status_code) override;
   bool GetMimeType(std::string* mime_type) const override;
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
@@ -80,7 +79,7 @@
   void DidSeek(int64 result);
 
   // Callback after data is asynchronously read from the content URI into |buf|.
-  void DidRead(int result);
+  void DidRead(scoped_refptr<net::IOBuffer> buf, int result);
 
   // The full path of the content URI.
   base::FilePath content_path_;
@@ -90,7 +89,6 @@
   const scoped_refptr<base::TaskRunner> content_task_runner_;
 
   net::HttpByteRange byte_range_;
-  net::Error range_parse_result_;
   int64 remaining_bytes_;
 
   bool io_pending_;
diff --git a/content/browser/appcache/appcache_url_request_job.cc b/content/browser/appcache/appcache_url_request_job.cc
index de924a1..82997f7 100644
--- a/content/browser/appcache/appcache_url_request_job.cc
+++ b/content/browser/appcache/appcache_url_request_job.cc
@@ -341,6 +341,7 @@
 void AppCacheURLRequestJob::OnReadComplete(int result) {
   DCHECK(is_delivering_appcache_response());
   if (result == 0) {
+    NotifyDone(net::URLRequestStatus());
     AppCacheHistograms::CountResponseRetrieval(
         true, is_main_resource_, manifest_url_.GetOrigin());
   } else if (result < 0) {
@@ -348,10 +349,13 @@
       storage_->service()->CheckAppCacheResponse(manifest_url_, cache_id_,
                                                  entry_.response_id());
     }
+    NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
     AppCacheHistograms::CountResponseRetrieval(
         false, is_main_resource_, manifest_url_.GetOrigin());
+  } else {
+    SetStatus(net::URLRequestStatus());  // Clear the IO_PENDING status
   }
-  ReadRawDataComplete(result);
+  NotifyReadComplete(result);
 }
 
 // net::URLRequestJob overrides ------------------------------------------------
@@ -420,14 +424,18 @@
   return http_info()->headers->response_code();
 }
 
-int AppCacheURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
+bool AppCacheURLRequestJob::ReadRawData(net::IOBuffer* buf,
+                                        int buf_size,
+                                        int* bytes_read) {
   DCHECK(is_delivering_appcache_response());
   DCHECK_NE(buf_size, 0);
+  DCHECK(bytes_read);
   DCHECK(!reader_->IsReadPending());
   reader_->ReadData(buf, buf_size,
                     base::Bind(&AppCacheURLRequestJob::OnReadComplete,
                                base::Unretained(this)));
-  return net::ERR_IO_PENDING;
+  SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+  return false;
 }
 
 void AppCacheURLRequestJob::SetExtraRequestHeaders(
diff --git a/content/browser/appcache/appcache_url_request_job.h b/content/browser/appcache/appcache_url_request_job.h
index 8f51e7b..95a3e18 100644
--- a/content/browser/appcache/appcache_url_request_job.h
+++ b/content/browser/appcache/appcache_url_request_job.h
@@ -148,7 +148,7 @@
   net::LoadState GetLoadState() const override;
   bool GetCharset(std::string* charset) override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   // Sets extra request headers for Job types that support request headers.
   // This is how we get informed of range-requests.
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
index df3fcb6..0e047b28 100644
--- a/content/browser/background_sync/background_sync_manager.cc
+++ b/content/browser/background_sync/background_sync_manager.cc
@@ -21,6 +21,7 @@
 #include "content/public/browser/background_sync_controller.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/common/background_sync.mojom.h"
 
 #if defined(OS_ANDROID)
 #include "content/browser/android/background_sync_network_observer_android.h"
@@ -716,7 +717,10 @@
   // with the registration so don't give it a BackgroundSyncRegistrationHandle.
   // Once the render process gets the handle_id it can create its own handle
   // (with a new unique handle id).
-  active_version->DispatchSyncEvent(handle_id, callback);
+  // TODO(iclelland): Set the last_chance bool to false if this event will be
+  // retried. (https://crbug.com/545589)
+  active_version->DispatchSyncEvent(
+      handle_id, BACKGROUND_SYNC_EVENT_LAST_CHANCE_IS_LAST_CHANCE, callback);
 }
 
 scoped_ptr<BackgroundSyncRegistrationHandle>
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h b/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h
index bbca0e9a5..c2ccf65d 100644
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h
+++ b/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h
@@ -28,6 +28,7 @@
  private:
   gfx::AcceleratedWidget widget_;
   bool software_mirror_active_;
+  bool ca_layers_disabled_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOverlayCandidateValidatorMac);
 };
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm b/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm
index 72317d6c..c45007e 100644
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm
+++ b/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm
@@ -5,6 +5,8 @@
 #include "content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h"
 
 #include "cc/output/overlay_strategy_sandwich.h"
+#include "content/browser/gpu/gpu_data_manager_impl.h"
+#include "gpu/config/gpu_driver_bug_workaround_type.h"
 
 namespace content {
 
@@ -12,7 +14,10 @@
     BrowserCompositorOverlayCandidateValidatorMac(
         gfx::AcceleratedWidget widget)
     : widget_(widget),
-      software_mirror_active_(false) {
+      software_mirror_active_(false),
+      ca_layers_disabled_(
+          GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive(
+              gpu::DISABLE_OVERLAY_CA_LAYERS)) {
 }
 
 BrowserCompositorOverlayCandidateValidatorMac::
@@ -31,6 +36,9 @@
   if (software_mirror_active_)
     return;
 
+  if (ca_layers_disabled_)
+    return;
+
   for (size_t i = 0; i < surfaces->size(); ++i)
     surfaces->at(i).overlay_handled = true;
 }
diff --git a/content/browser/fileapi/file_writer_delegate_unittest.cc b/content/browser/fileapi/file_writer_delegate_unittest.cc
index 9eb73b1..c9bcfbb7 100644
--- a/content/browser/fileapi/file_writer_delegate_unittest.cc
+++ b/content/browser/fileapi/file_writer_delegate_unittest.cc
@@ -184,15 +184,17 @@
         base::Bind(&FileWriterDelegateTestJob::NotifyHeadersComplete, this));
   }
 
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override {
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override {
     if (remaining_bytes_ < buf_size)
-      buf_size = remaining_bytes_;
+      buf_size = static_cast<int>(remaining_bytes_);
 
     for (int i = 0; i < buf_size; ++i)
       buf->data()[i] = content_[cursor_++];
     remaining_bytes_ -= buf_size;
 
-    return buf_size;
+    SetStatus(net::URLRequestStatus());
+    *bytes_read = buf_size;
+    return true;
   }
 
   int GetResponseCode() const override { return 200; }
diff --git a/content/browser/frame_host/frame_navigation_entry.cc b/content/browser/frame_host/frame_navigation_entry.cc
index bb960507..74d9a39 100644
--- a/content/browser/frame_host/frame_navigation_entry.cc
+++ b/content/browser/frame_host/frame_navigation_entry.cc
@@ -13,12 +13,14 @@
 }
 
 FrameNavigationEntry::FrameNavigationEntry(int frame_tree_node_id,
+                                           const std::string& frame_unique_name,
                                            int64 item_sequence_number,
                                            int64 document_sequence_number,
                                            SiteInstanceImpl* site_instance,
                                            const GURL& url,
                                            const Referrer& referrer)
     : frame_tree_node_id_(frame_tree_node_id),
+      frame_unique_name_(frame_unique_name),
       item_sequence_number_(item_sequence_number),
       document_sequence_number_(document_sequence_number),
       site_instance_(site_instance),
@@ -31,17 +33,20 @@
 
 FrameNavigationEntry* FrameNavigationEntry::Clone() const {
   FrameNavigationEntry* copy = new FrameNavigationEntry(frame_tree_node_id_);
-  copy->UpdateEntry(item_sequence_number_, document_sequence_number_,
-                    site_instance_.get(), url_, referrer_, page_state_);
+  copy->UpdateEntry(frame_unique_name_, item_sequence_number_,
+                    document_sequence_number_, site_instance_.get(), url_,
+                    referrer_, page_state_);
   return copy;
 }
 
-void FrameNavigationEntry::UpdateEntry(int64 item_sequence_number,
+void FrameNavigationEntry::UpdateEntry(const std::string& frame_unique_name,
+                                       int64 item_sequence_number,
                                        int64 document_sequence_number,
                                        SiteInstanceImpl* site_instance,
                                        const GURL& url,
                                        const Referrer& referrer,
                                        const PageState& page_state) {
+  frame_unique_name_ = frame_unique_name;
   item_sequence_number_ = item_sequence_number;
   document_sequence_number_ = document_sequence_number;
   site_instance_ = site_instance;
diff --git a/content/browser/frame_host/frame_navigation_entry.h b/content/browser/frame_host/frame_navigation_entry.h
index d92a924f..fcbdb047 100644
--- a/content/browser/frame_host/frame_navigation_entry.h
+++ b/content/browser/frame_host/frame_navigation_entry.h
@@ -19,17 +19,16 @@
 // For now, it is owned by a single NavigationEntry and only tracks the main
 // frame.
 //
-// TODO(creis): In --site-per-process, fill in a tree of FrameNavigationEntries
-// in each NavigationEntry, one per frame.  FrameNavigationEntries may be shared
-// across NavigationEntries if the frame hasn't changed.
+// If SiteIsolationPolicy::UseSubframeNavigationEntries is true, there will be a
+// tree of FrameNavigationEntries in each NavigationEntry, one per frame.
+// TODO(creis): Share these FrameNavigationEntries across NavigationEntries if
+// the frame hasn't changed.
 class CONTENT_EXPORT FrameNavigationEntry
     : public base::RefCounted<FrameNavigationEntry> {
  public:
-  // TODO(creis): We should not use FTN IDs here, since they will change if you
-  // leave a page and come back later.  We should evaluate whether Blink's
-  // unique names would work instead, similar to HistoryNode.
   explicit FrameNavigationEntry(int frame_tree_node_id);
   FrameNavigationEntry(int frame_tree_node_id,
+                       const std::string& frame_unique_name,
                        int64 item_sequence_number,
                        int64 document_sequence_number,
                        SiteInstanceImpl* site_instance,
@@ -41,7 +40,8 @@
   FrameNavigationEntry* Clone() const;
 
   // Updates all the members of this entry.
-  void UpdateEntry(int64 item_sequence_number,
+  void UpdateEntry(const std::string& frame_unique_name,
+                   int64 item_sequence_number,
                    int64 document_sequence_number,
                    SiteInstanceImpl* site_instance,
                    const GURL& url,
@@ -51,9 +51,23 @@
   // The ID of the FrameTreeNode this entry is for.  -1 for the main frame,
   // since we don't always know the FrameTreeNode ID when creating the overall
   // NavigationEntry.
-  // TODO(creis): Replace with frame sequence number or unique name.
+  // TODO(creis): Consider removing |frame_tree_node_id| in favor of
+  // |frame_unique_name|, if we can move unique name computation to the browser
+  // process.
   int frame_tree_node_id() const { return frame_tree_node_id_; }
 
+  // The unique name of the frame this entry is for.  This is a stable name for
+  // the frame based on its position in the tree and relation to other named
+  // frames, which does not change after cross-process navigations or restores.
+  // Only the main frame can have an empty name.
+  //
+  // This is unique relative to other frames in the same page, but not among
+  // other pages (i.e., not globally unique).
+  const std::string& frame_unique_name() const { return frame_unique_name_; }
+  void set_frame_unique_name(const std::string& frame_unique_name) {
+    frame_unique_name_ = frame_unique_name;
+  }
+
   // Keeps track of where this entry belongs in the frame's session history.
   // The item sequence number identifies each stop in the back/forward history
   // and is globally unique.  The document sequence number increments for each
@@ -91,13 +105,14 @@
   virtual ~FrameNavigationEntry();
 
   // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
-  // For all new fields, update |Clone|.
+  // Add all new fields to |UpdateEntry|.
   // TODO(creis): These fields have implications for session restore.  This is
   // currently managed by NavigationEntry, but the logic will move here.
   // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 
   // See the accessors above for descriptions.
   int frame_tree_node_id_;
+  std::string frame_unique_name_;
   int64 item_sequence_number_;
   int64 document_sequence_number_;
   scoped_refptr<SiteInstanceImpl> site_instance_;
diff --git a/content/browser/frame_host/interstitial_page_impl.cc b/content/browser/frame_host/interstitial_page_impl.cc
index c3e6fa1d..3b37a7c3 100644
--- a/content/browser/frame_host/interstitial_page_impl.cc
+++ b/content/browser/frame_host/interstitial_page_impl.cc
@@ -758,10 +758,6 @@
   create_view_ = false;
 }
 
-gfx::Rect InterstitialPageImpl::GetRootWindowResizerRect() const {
-  return gfx::Rect();
-}
-
 void InterstitialPageImpl::CreateNewWindow(
     SiteInstance* source_site_instance,
     int32_t route_id,
diff --git a/content/browser/frame_host/interstitial_page_impl.h b/content/browser/frame_host/interstitial_page_impl.h
index cd15e8d..e7d2e58 100644
--- a/content/browser/frame_host/interstitial_page_impl.h
+++ b/content/browser/frame_host/interstitial_page_impl.h
@@ -119,7 +119,6 @@
                             int error_code) override;
   RendererPreferences GetRendererPrefs(
       BrowserContext* browser_context) const override;
-  gfx::Rect GetRootWindowResizerRect() const override;
   void CreateNewWindow(
       SiteInstance* source_site_instance,
       int32_t route_id,
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 6ceff9a..87abff0 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -748,7 +748,7 @@
       if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
         entry = GetLastCommittedEntry()->Clone();
         entry->SetPageID(-1);
-        entry->AddOrUpdateFrameEntry(node, -1, -1, nullptr, params.url,
+        entry->AddOrUpdateFrameEntry(node, "", -1, -1, nullptr, params.url,
                                      params.referrer, PageState());
       }
     }
@@ -1124,6 +1124,7 @@
   // Update the FrameNavigationEntry for new main frame commits.
   FrameNavigationEntry* frame_entry =
       new_entry->GetFrameEntry(rfh->frame_tree_node());
+  frame_entry->set_frame_unique_name(params.frame_unique_name);
   frame_entry->set_item_sequence_number(params.item_sequence_number);
   frame_entry->set_document_sequence_number(params.document_sequence_number);
 
@@ -1259,7 +1260,7 @@
   if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
     // Make sure new_entry takes ownership of frame_entry in a scoped_refptr.
     FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
-        rfh->frame_tree_node()->frame_tree_node_id(),
+        rfh->frame_tree_node()->frame_tree_node_id(), params.frame_unique_name,
         params.item_sequence_number, params.document_sequence_number,
         rfh->GetSiteInstance(), params.url, params.referrer);
     new_entry = GetLastCommittedEntry()->CloneAndReplace(rfh->frame_tree_node(),
@@ -1320,9 +1321,9 @@
     // it may be a "history auto" case where we update an existing one.
     NavigationEntryImpl* last_committed = GetLastCommittedEntry();
     last_committed->AddOrUpdateFrameEntry(
-        rfh->frame_tree_node(), params.item_sequence_number,
-        params.document_sequence_number, rfh->GetSiteInstance(), params.url,
-        params.referrer, params.page_state);
+        rfh->frame_tree_node(), params.frame_unique_name,
+        params.item_sequence_number, params.document_sequence_number,
+        rfh->GetSiteInstance(), params.url, params.referrer, params.page_state);
 
     // Cross-process subframe navigations may leave a pending entry around.
     // Clear it if it's actually for the subframe.
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
index fe2616c..373f010 100644
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -1904,6 +1904,94 @@
   }
 }
 
+// Verifies that the |frame_unique_name| is set to the correct frame, so that we
+// can match subframe FrameNavigationEntries to newly created frames after
+// back/forward and restore.
+IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
+                       FrameNavigationEntry_FrameUniqueName) {
+  const NavigationControllerImpl& controller =
+      static_cast<const NavigationControllerImpl&>(
+          shell()->web_contents()->GetController());
+
+  // 1. Navigate the main frame.
+  GURL url(embedded_test_server()->GetURL(
+      "/navigation_controller/page_with_links.html"));
+  NavigateToURL(shell(), url);
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetFrameTree()
+                            ->root();
+  SiteInstance* main_site_instance =
+      root->current_frame_host()->GetSiteInstance();
+
+  // The main frame defaults to an empty name.
+  FrameNavigationEntry* frame_entry =
+      controller.GetLastCommittedEntry()->GetFrameEntry(root);
+  EXPECT_EQ("", frame_entry->frame_unique_name());
+
+  // Test subframe unique names only if enabled, e.g. in --site-per-process.
+  if (!SiteIsolationPolicy::UseSubframeNavigationEntries())
+    return;
+
+  // 2. Add an unnamed subframe, which does an AUTO_SUBFRAME navigation.
+  {
+    LoadCommittedCapturer capturer(shell()->web_contents());
+    std::string script = "var iframe = document.createElement('iframe');"
+                         "iframe.src = '" + url.spec() + "';"
+                         "document.body.appendChild(iframe);";
+    EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
+    capturer.Wait();
+    EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+  }
+
+  // The root FrameNavigationEntry hasn't changed.
+  EXPECT_EQ(frame_entry,
+            controller.GetLastCommittedEntry()->GetFrameEntry(root));
+
+  // The subframe should have a generated name.
+  FrameTreeNode* subframe = root->child_at(0);
+  EXPECT_EQ(main_site_instance,
+            subframe->current_frame_host()->GetSiteInstance());
+  FrameNavigationEntry* subframe_entry =
+      controller.GetLastCommittedEntry()->GetFrameEntry(subframe);
+  std::string unnamed_subframe_name = "<!--framePath //<!--frame0-->-->";
+  EXPECT_EQ(unnamed_subframe_name, subframe_entry->frame_unique_name());
+
+  // 3. Add a named subframe.
+  {
+    LoadCommittedCapturer capturer(shell()->web_contents());
+    std::string script = "var iframe = document.createElement('iframe');"
+                         "iframe.src = '" + url.spec() + "';"
+                         "iframe.name = 'foo';"
+                         "document.body.appendChild(iframe);";
+    EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
+    capturer.Wait();
+    EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
+  }
+
+  // The new subframe should have the specified name.
+  EXPECT_EQ(frame_entry,
+            controller.GetLastCommittedEntry()->GetFrameEntry(root));
+  FrameTreeNode* foo_subframe = root->child_at(1);
+  EXPECT_EQ(main_site_instance,
+            foo_subframe->current_frame_host()->GetSiteInstance());
+  FrameNavigationEntry* foo_subframe_entry =
+      controller.GetLastCommittedEntry()->GetFrameEntry(foo_subframe);
+  std::string named_subframe_name = "foo";
+  EXPECT_EQ(named_subframe_name, foo_subframe_entry->frame_unique_name());
+
+  // 4. Navigating in the subframes cross-process shouldn't change their names.
+  // TODO(creis): Fix the unnamed case in https://crbug.com/502317.
+  GURL bar_url(embedded_test_server()->GetURL(
+      "bar.com", "/navigation_controller/simple_page_1.html"));
+  NavigateFrameToURL(foo_subframe, bar_url);
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+  EXPECT_NE(main_site_instance,
+            foo_subframe->current_frame_host()->GetSiteInstance());
+  foo_subframe_entry =
+      controller.GetLastCommittedEntry()->GetFrameEntry(foo_subframe);
+  EXPECT_EQ(named_subframe_name, foo_subframe_entry->frame_unique_name());
+}
+
 // Verifies that item sequence numbers and document sequence numbers update
 // properly for main frames and subframes.
 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
@@ -1946,10 +2034,10 @@
   // 3. Add a subframe, which does an AUTO_SUBFRAME navigation.
   {
     LoadCommittedCapturer capturer(shell()->web_contents());
-    std::string script = "var iframe = document.createElement('iframe');"
-                         "iframe.src = '" + url.spec() + "';"
-                         "document.body.appendChild(iframe);";
-    EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
+    std::string add_script = "var iframe = document.createElement('iframe');"
+                             "iframe.src = '" + url.spec() + "';"
+                             "document.body.appendChild(iframe);";
+    EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), add_script));
     capturer.Wait();
     EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
   }
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc
index a1f47a99..8102a47 100644
--- a/content/browser/frame_host/navigation_entry_impl.cc
+++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -102,7 +102,7 @@
                                          ui::PageTransition transition_type,
                                          bool is_renderer_initiated)
     : frame_tree_(new TreeNode(
-          new FrameNavigationEntry(-1, -1, -1, instance, url, referrer))),
+          new FrameNavigationEntry(-1, "", -1, -1, instance, url, referrer))),
       unique_id_(GetUniqueIDInConstructor()),
       bindings_(kInvalidBindings),
       page_type_(PAGE_TYPE_NORMAL),
@@ -547,13 +547,15 @@
 #endif
 }
 
-void NavigationEntryImpl::AddOrUpdateFrameEntry(FrameTreeNode* frame_tree_node,
-                                                int64 item_sequence_number,
-                                                int64 document_sequence_number,
-                                                SiteInstanceImpl* site_instance,
-                                                const GURL& url,
-                                                const Referrer& referrer,
-                                                const PageState& page_state) {
+void NavigationEntryImpl::AddOrUpdateFrameEntry(
+    FrameTreeNode* frame_tree_node,
+    const std::string& frame_unique_name,
+    int64 item_sequence_number,
+    int64 document_sequence_number,
+    SiteInstanceImpl* site_instance,
+    const GURL& url,
+    const Referrer& referrer,
+    const PageState& page_state) {
   // We should already have a TreeNode for the parent node by the time this node
   // commits.  Find it first.
   DCHECK(frame_tree_node->parent());
@@ -570,7 +572,7 @@
   for (TreeNode* child : parent_node->children) {
     if (child->frame_entry->frame_tree_node_id() == frame_tree_node_id) {
       // Update the existing FrameNavigationEntry (e.g., for replaceState).
-      child->frame_entry->UpdateEntry(item_sequence_number,
+      child->frame_entry->UpdateEntry(frame_unique_name, item_sequence_number,
                                       document_sequence_number, site_instance,
                                       url, referrer, page_state);
       return;
@@ -581,8 +583,8 @@
   // Unordered list, since we expect to look up entries by frame sequence number
   // or unique name.
   FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
-      frame_tree_node_id, item_sequence_number, document_sequence_number,
-      site_instance, url, referrer);
+      frame_tree_node_id, frame_unique_name, item_sequence_number,
+      document_sequence_number, site_instance, url, referrer);
   frame_entry->set_page_state(page_state);
   parent_node->children.push_back(
       new NavigationEntryImpl::TreeNode(frame_entry));
diff --git a/content/browser/frame_host/navigation_entry_impl.h b/content/browser/frame_host/navigation_entry_impl.h
index 7eb9a4c..051a3ba9 100644
--- a/content/browser/frame_host/navigation_entry_impl.h
+++ b/content/browser/frame_host/navigation_entry_impl.h
@@ -180,6 +180,7 @@
   // Does nothing if there is no entry already and |url| is about:blank, since
   // that does not count as a real commit.
   void AddOrUpdateFrameEntry(FrameTreeNode* frame_tree_node,
+                             const std::string& frame_unique_name,
                              int64 item_sequence_number,
                              int64 document_sequence_number,
                              SiteInstanceImpl* site_instance,
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 0928d4dad..a9bdefbb 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -39,6 +39,7 @@
 #include "content/browser/renderer_host/render_view_host_delegate.h"
 #include "content/browser/renderer_host/render_view_host_delegate_view.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_delegate.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/wake_lock/wake_lock_service_context.h"
@@ -1941,8 +1942,10 @@
   // continuing to run its script and dragging out the process.
   // This must be done after sending the reply since RenderView can't close
   // correctly while waiting for a response.
-  if (is_waiting && dialog_was_suppressed)
-    render_view_host_->delegate_->RendererUnresponsive(render_view_host_);
+  if (is_waiting && dialog_was_suppressed) {
+    render_view_host_->GetWidget()->delegate()->RendererUnresponsive(
+        render_view_host_->GetWidget());
+  }
 }
 
 // PlzNavigate
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc
index e1d2b5b..1ac1b08 100644
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -1870,7 +1870,7 @@
   EXPECT_TRUE(contents()->CrossProcessNavigationPending());
 
   // Simulate the unresponsiveness timer.  The tab should close.
-  contents()->RendererUnresponsive(rfh1->render_view_host());
+  contents()->RendererUnresponsive(rfh1->render_view_host()->GetWidget());
   EXPECT_TRUE(close_delegate.is_closed());
 }
 
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc
index 2c1c5ec..cb394f8 100644
--- a/content/browser/host_zoom_map_impl.cc
+++ b/content/browser/host_zoom_map_impl.cc
@@ -75,6 +75,8 @@
 }
 
 HostZoomMap* HostZoomMap::GetForWebContents(const WebContents* contents) {
+  // TODO(wjmaclean): Update this behaviour to work with OOPIF.
+  // See crbug.com/528407.
   StoragePartition* partition =
       BrowserContext::GetStoragePartition(contents->GetBrowserContext(),
                                           contents->GetSiteInstance());
diff --git a/content/browser/media/webrtc_browsertest.cc b/content/browser/media/webrtc_browsertest.cc
index 9f05713..20adb69 100644
--- a/content/browser/media/webrtc_browsertest.cc
+++ b/content/browser/media/webrtc_browsertest.cc
@@ -122,9 +122,16 @@
   MakeTypicalPeerConnectionCall("call({video: true, audio: true});");
 }
 
+
+#if defined(OS_WIN) && !defined(NVALGRIND)
 // Times out on Dr. Memory bots: https://crbug.com/545740
+#define MAYBE_CanSetupCallAndSendDtmf DISABLED_CanSetupCallAndSendDtmf
+#else
+#define MAYBE_CanSetupCallAndSendDtmf CanSetupCallAndSendDtmf
+#endif
+
 IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcBrowserTest,
-                       DISABLED_CanSetupCallAndSendDtmf) {
+                       MAYBE_CanSetupCallAndSendDtmf) {
   MakeTypicalPeerConnectionCall("callAndSendDtmf(\'123,abc\');");
 }
 
diff --git a/content/browser/net/view_http_cache_job_factory.cc b/content/browser/net/view_http_cache_job_factory.cc
index 3f9570eed..41e7b377 100644
--- a/content/browser/net/view_http_cache_job_factory.cc
+++ b/content/browser/net/view_http_cache_job_factory.cc
@@ -10,7 +10,6 @@
 #include "base/compiler_specific.h"
 #include "base/location.h"
 #include "base/memory/weak_ptr.h"
-#include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/thread_task_runner_handle.h"
@@ -45,8 +44,8 @@
   bool GetCharset(std::string* charset) override {
     return core_->GetCharset(charset);
   }
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override {
-    return core_->ReadRawData(buf, buf_size);
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override {
+    return core_->ReadRawData(buf, buf_size, bytes_read);
   }
 
  private:
@@ -66,7 +65,7 @@
 
     bool GetMimeType(std::string* mime_type) const;
     bool GetCharset(std::string* charset);
-    int ReadRawData(net::IOBuffer* buf, int buf_size);
+    bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read);
 
    private:
     friend class base::RefCounted<Core>;
@@ -165,13 +164,17 @@
   return true;
 }
 
-int ViewHttpCacheJob::Core::ReadRawData(net::IOBuffer* buf, int buf_size) {
-  int remaining = base::checked_cast<int>(data_.size()) - data_offset_;
+bool ViewHttpCacheJob::Core::ReadRawData(net::IOBuffer* buf,
+                                         int buf_size,
+                                         int* bytes_read) {
+  DCHECK(bytes_read);
+  int remaining = static_cast<int>(data_.size()) - data_offset_;
   if (buf_size > remaining)
     buf_size = remaining;
   memcpy(buf->data(), data_.data() + data_offset_, buf_size);
   data_offset_ += buf_size;
-  return buf_size;
+  *bytes_read = buf_size;
+  return true;
 }
 
 void ViewHttpCacheJob::Core::OnIOComplete(int result) {
diff --git a/content/browser/presentation/presentation_service_impl.cc b/content/browser/presentation/presentation_service_impl.cc
index 89f89d4..dd5203dc 100644
--- a/content/browser/presentation/presentation_service_impl.cc
+++ b/content/browser/presentation/presentation_service_impl.cc
@@ -427,11 +427,11 @@
 
 void PresentationServiceImpl::OnSessionStateChanged(
     const PresentationSessionInfo& session_info,
-    PresentationSessionState session_state) {
+    PresentationConnectionState session_state) {
   DCHECK(client_.get());
   client_->OnSessionStateChanged(
       presentation::PresentationSessionInfo::From(session_info),
-      PresentationSessionStateToMojo(session_state));
+      PresentationConnectionStateToMojo(session_state));
 }
 
 bool PresentationServiceImpl::FrameMatches(
diff --git a/content/browser/presentation/presentation_service_impl.h b/content/browser/presentation/presentation_service_impl.h
index cbea133..220c256 100644
--- a/content/browser/presentation/presentation_service_impl.h
+++ b/content/browser/presentation/presentation_service_impl.h
@@ -98,7 +98,7 @@
       mojo::Callback<void(presentation::PresentationSessionInfoPtr)>;
   using SessionStateCallback =
       mojo::Callback<void(presentation::PresentationSessionInfoPtr,
-          presentation::PresentationSessionState)>;
+                          presentation::PresentationConnectionState)>;
   using SessionMessagesCallback =
       mojo::Callback<void(mojo::Array<presentation::SessionMessagePtr>)>;
   using SendMessageMojoCallback = mojo::Callback<void(bool)>;
@@ -256,7 +256,7 @@
   // Invoked by the embedder's PresentationServiceDelegate when a
   // presentation session's state has changed.
   void OnSessionStateChanged(const PresentationSessionInfo& session_info,
-                             PresentationSessionState session_state);
+                             PresentationConnectionState session_state);
 
   // Returns true if this object is associated with |render_frame_host|.
   bool FrameMatches(content::RenderFrameHost* render_frame_host) const;
diff --git a/content/browser/presentation/presentation_service_impl_unittest.cc b/content/browser/presentation/presentation_service_impl_unittest.cc
index be53cda..3716586eb 100644
--- a/content/browser/presentation/presentation_service_impl_unittest.cc
+++ b/content/browser/presentation/presentation_service_impl_unittest.cc
@@ -155,12 +155,12 @@
       void(const mojo::String& url, bool available));
   void OnSessionStateChanged(
       presentation::PresentationSessionInfoPtr session_info,
-      presentation::PresentationSessionState new_state) override {
+      presentation::PresentationConnectionState new_state) override {
     OnSessionStateChanged(*session_info, new_state);
   }
   MOCK_METHOD2(OnSessionStateChanged,
                void(const presentation::PresentationSessionInfo& session_info,
-                    presentation::PresentationSessionState new_state));
+                    presentation::PresentationConnectionState new_state));
 
   MOCK_METHOD1(OnScreenAvailabilityNotSupported, void(const mojo::String& url));
 
@@ -838,10 +838,10 @@
   EXPECT_CALL(mock_client_,
               OnSessionStateChanged(
                   Equals(session_info),
-                  presentation::PRESENTATION_SESSION_STATE_CONNECTED));
+                  presentation::PRESENTATION_CONNECTION_STATE_CONNECTED));
   service_impl_->OnSessionStateChanged(
       content::PresentationSessionInfo(kPresentationUrl, kPresentationId),
-      content::PRESENTATION_SESSION_STATE_CONNECTED);
+      content::PRESENTATION_CONNECTION_STATE_CONNECTED);
 }
 
 TEST_F(PresentationServiceImplTest, ScreenAvailabilityNotSupported) {
diff --git a/content/browser/presentation/presentation_type_converters.cc b/content/browser/presentation/presentation_type_converters.cc
index c39f8c86..ff32231 100644
--- a/content/browser/presentation/presentation_type_converters.cc
+++ b/content/browser/presentation/presentation_type_converters.cc
@@ -19,18 +19,23 @@
       return presentation::PRESENTATION_ERROR_TYPE_NO_PRESENTATION_FOUND;
     case content::PRESENTATION_ERROR_UNKNOWN:
       return presentation::PRESENTATION_ERROR_TYPE_UNKNOWN;
-    default:
-      NOTREACHED();
-      return presentation::PRESENTATION_ERROR_TYPE_UNKNOWN;
   }
+  NOTREACHED();
+  return presentation::PRESENTATION_ERROR_TYPE_UNKNOWN;
 }
 
-presentation::PresentationSessionState PresentationSessionStateToMojo(
-    content::PresentationSessionState state) {
-  if (state == content::PRESENTATION_SESSION_STATE_CONNECTED)
-    return presentation::PRESENTATION_SESSION_STATE_CONNECTED;
-  else
-    return presentation::PRESENTATION_SESSION_STATE_DISCONNECTED;
+presentation::PresentationConnectionState PresentationConnectionStateToMojo(
+    content::PresentationConnectionState state) {
+  switch (state) {
+    case content::PRESENTATION_CONNECTION_STATE_CONNECTED:
+      return presentation::PRESENTATION_CONNECTION_STATE_CONNECTED;
+    case content::PRESENTATION_CONNECTION_STATE_CLOSED:
+      return presentation::PRESENTATION_CONNECTION_STATE_CLOSED;
+    case content::PRESENTATION_CONNECTION_STATE_TERMINATED:
+      return presentation::PRESENTATION_CONNECTION_STATE_TERMINATED;
+  }
+  NOTREACHED();
+  return presentation::PRESENTATION_CONNECTION_STATE_TERMINATED;
 }
 
 }  // namespace content
diff --git a/content/browser/presentation/presentation_type_converters.h b/content/browser/presentation/presentation_type_converters.h
index f66c3230..807368a3 100644
--- a/content/browser/presentation/presentation_type_converters.h
+++ b/content/browser/presentation/presentation_type_converters.h
@@ -14,8 +14,8 @@
 CONTENT_EXPORT presentation::PresentationErrorType PresentationErrorTypeToMojo(
     PresentationErrorType input);
 
-CONTENT_EXPORT presentation::PresentationSessionState
-PresentationSessionStateToMojo(PresentationSessionState state);
+CONTENT_EXPORT presentation::PresentationConnectionState
+PresentationConnectionStateToMojo(PresentationConnectionState state);
 
 }  // namespace content
 
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc
index bd0101d1..7f8abacc 100644
--- a/content/browser/renderer_host/legacy_render_widget_host_win.cc
+++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -13,10 +13,10 @@
 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
 #include "content/public/browser/browser_accessibility_state.h"
 #include "content/public/common/content_switches.h"
-#include "ui/base/touch/touch_enabled.h"
 #include "ui/base/view_prop.h"
 #include "ui/base/win/internal_constants.h"
 #include "ui/base/win/window_event_target.h"
+#include "ui/events/base_event_utils.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/win/direct_manipulation.h"
 #include "ui/gfx/win/dpi.h"
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index e12d55b0..e9e71e2 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1455,6 +1455,7 @@
 #if defined(OS_ANDROID)
     switches::kDisableGestureRequirementForMediaPlayback,
     switches::kDisableWebAudio,
+    switches::kEnableUnifiedMediaPipeline,
     switches::kIPCSyncCompositing,
     switches::kRendererWaitForJavaDebugger,
 #endif
diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h
index 37bb5421..cb08ab8 100644
--- a/content/browser/renderer_host/render_view_host_delegate.h
+++ b/content/browser/renderer_host/render_view_host_delegate.h
@@ -33,7 +33,6 @@
 }
 
 namespace gfx {
-class Point;
 class Rect;
 class Size;
 }
@@ -83,10 +82,6 @@
   // jam as reviewers before you use this method. http://crbug.com/82582
   virtual WebContents* GetAsWebContents();
 
-  // Return the rect where to display the resize corner, if any, otherwise
-  // an empty rect.
-  virtual gfx::Rect GetRootWindowResizerRect() const = 0;
-
   // The RenderView is being constructed (message sent to the renderer process
   // to construct a RenderView).  Now is a good time to send other setup events
   // to the RenderView.  This precedes any other commands to the RenderView.
@@ -135,26 +130,12 @@
   virtual RendererPreferences GetRendererPrefs(
       BrowserContext* browser_context) const = 0;
 
-  // Notification the user has made a gesture while focus was on the
-  // page. This is used to avoid uninitiated user downloads (aka carpet
-  // bombing), see DownloadRequestLimiter for details.
-  virtual void OnUserGesture() {}
-
   // Notification from the renderer host that blocked UI event occurred.
   // This happens when there are tab-modal dialogs. In this case, the
   // notification is needed to let us draw attention to the dialog (i.e.
   // refocus on the modal dialog, flash title etc).
   virtual void OnIgnoredUIEvent() {}
 
-  // Notification that the renderer has become unresponsive. The
-  // delegate can use this notification to show a warning to the user.
-  virtual void RendererUnresponsive(RenderViewHost* render_view_host) {}
-
-  // Notification that a previously unresponsive renderer has become
-  // responsive again. The delegate can use this notification to end the
-  // warning shown to the user.
-  virtual void RendererResponsive(RenderViewHost* render_view_host) {}
-
   // Notification that the RenderViewHost's load state changed.
   virtual void LoadStateChanged(const GURL& url,
                                 const net::LoadStateWithParam& load_state,
@@ -182,15 +163,6 @@
   // The contents' preferred size changed.
   virtual void UpdatePreferredSize(const gfx::Size& pref_size) {}
 
-  // The contents auto-resized and the container should match it.
-  virtual void ResizeDueToAutoResize(const gfx::Size& new_size) {}
-
-  // Requests to lock the mouse. Once the request is approved or rejected,
-  // GotResponseToLockMouseRequest() will be called on the requesting render
-  // view host.
-  virtual void RequestToLockMouse(bool user_gesture,
-                                  bool last_unlocked_by_target) {}
-
   // Notification that the view has lost the mouse lock.
   virtual void LostMouseLock() {}
 
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 9a7611b..c5d2387 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -79,8 +79,8 @@
 #include "storage/browser/fileapi/isolated_context.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/touch/touch_device.h"
-#include "ui/base/touch/touch_enabled.h"
 #include "ui/base/ui_base_switches.h"
+#include "ui/events/base_event_utils.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/native_theme/native_theme_switches.h"
@@ -964,8 +964,6 @@
     IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnFocusedNodeChanged)
     IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnClosePageACK)
     IPC_MESSAGE_HANDLER(ViewHostMsg_DidZoomURL, OnDidZoomURL)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_PageScaleFactorIsOneChanged,
-                        OnPageScaleFactorIsOneChanged)
     IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser)
     IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeTouched, OnFocusedNodeTouched)
     // Have the super handle all other messages.
@@ -1130,10 +1128,6 @@
   delegate_->UpdatePreferredSize(new_size);
 }
 
-void RenderViewHostImpl::OnRenderAutoResized(const gfx::Size& new_size) {
-  delegate_->ResizeDueToAutoResize(new_size);
-}
-
 void RenderViewHostImpl::OnRouteCloseEvent() {
   // Have the delegate route this to the active RenderViewHost.
   delegate_->RouteCloseEvent(this);
@@ -1235,28 +1229,11 @@
                                          Details<FocusedNodeDetails>(&details));
 }
 
-void RenderViewHostImpl::OnUserGesture() {
-  delegate_->OnUserGesture();
-}
-
 void RenderViewHostImpl::OnClosePageACK() {
   GetWidget()->decrement_in_flight_event_count();
   ClosePageIgnoringUnloadEvents();
 }
 
-void RenderViewHostImpl::NotifyRendererUnresponsive() {
-  delegate_->RendererUnresponsive(this);
-}
-
-void RenderViewHostImpl::NotifyRendererResponsive() {
-  delegate_->RendererResponsive(this);
-}
-
-void RenderViewHostImpl::RequestToLockMouse(bool user_gesture,
-                                            bool last_unlocked_by_target) {
-  delegate_->RequestToLockMouse(user_gesture, last_unlocked_by_target);
-}
-
 bool RenderViewHostImpl::IsFullscreenGranted() const {
   return delegate_->IsFullscreenForCurrentTab();
 }
@@ -1271,10 +1248,6 @@
   delegate_->Activate();
 }
 
-gfx::Rect RenderViewHostImpl::GetRootWindowResizerRect() const {
-  return delegate_->GetRootWindowResizerRect();
-}
-
 void RenderViewHostImpl::ForwardMouseEvent(
     const blink::WebMouseEvent& mouse_event) {
   RenderWidgetHostImpl::ForwardMouseEvent(mouse_event);
@@ -1394,19 +1367,6 @@
                                      net::GetHostOrSpecFromURL(url));
 }
 
-void RenderViewHostImpl::OnPageScaleFactorIsOneChanged(bool is_one) {
-  if (!GetSiteInstance())
-    return;
-  HostZoomMapImpl* host_zoom_map =
-      static_cast<HostZoomMapImpl*>(HostZoomMap::Get(GetSiteInstance()));
-  if (!host_zoom_map)
-    return;
-  if (!GetProcess())
-    return;
-  host_zoom_map->SetPageScaleFactorIsOneForView(GetProcess()->GetID(),
-                                                GetRoutingID(), is_one);
-}
-
 void RenderViewHostImpl::OnRunFileChooser(const FileChooserParams& params) {
   // Do not allow messages with absolute paths in them as this can permit a
   // renderer to coerce the browser to perform I/O on a renderer controlled
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 3c1ea4b8..88ec881 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -289,7 +289,6 @@
   void SetIsLoading(bool is_loading) override;
   void ForwardMouseEvent(const blink::WebMouseEvent& mouse_event) override;
   void ForwardKeyboardEvent(const NativeWebKeyboardEvent& key_event) override;
-  gfx::Rect GetRootWindowResizerRect() const override;
 
   // Creates a new RenderView with the given route id.
   void CreateNewWindow(int32_t route_id,
@@ -333,12 +332,6 @@
 
  protected:
   // RenderWidgetHost protected overrides.
-  void OnUserGesture() override;
-  void NotifyRendererUnresponsive() override;
-  void NotifyRendererResponsive() override;
-  void OnRenderAutoResized(const gfx::Size& size) override;
-  void RequestToLockMouse(bool user_gesture,
-                          bool last_unlocked_by_target) override;
   bool IsFullscreenGranted() const override;
   blink::WebDisplayMode GetDisplayMode() const override;
   void OnFocus() override;
@@ -370,7 +363,6 @@
                             const gfx::Rect& node_bounds_in_viewport);
   void OnClosePageACK();
   void OnDidZoomURL(double zoom_level, const GURL& url);
-  void OnPageScaleFactorIsOneChanged(bool is_one);
   void OnRunFileChooser(const FileChooserParams& params);
   void OnFocusedNodeTouched(bool editable);
 
diff --git a/content/browser/renderer_host/render_widget_host_delegate.cc b/content/browser/renderer_host/render_widget_host_delegate.cc
index fd9c1cb..1bf6ee8 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.cc
+++ b/content/browser/renderer_host/render_widget_host_delegate.cc
@@ -4,6 +4,7 @@
 
 #include "base/basictypes.h"
 #include "content/browser/renderer_host/render_widget_host_delegate.h"
+#include "ui/gfx/geometry/rect.h"
 
 namespace content {
 
@@ -53,4 +54,9 @@
   return nullptr;
 }
 
+gfx::Rect RenderWidgetHostDelegate::GetRootWindowResizerRect(
+    RenderWidgetHostImpl* render_widget_host) const {
+  return gfx::Rect();
+};
+
 }  // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h
index aa9b4ff..635fc42 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -18,6 +18,8 @@
 
 namespace gfx {
 class Point;
+class Rect;
+class Size;
 }
 
 namespace content {
@@ -44,6 +46,10 @@
   virtual void RenderWidgetWasResized(RenderWidgetHostImpl* render_widget_host,
                                       bool width_changed) {}
 
+  // The contents auto-resized and the container should match it.
+  virtual void ResizeDueToAutoResize(RenderWidgetHostImpl* render_widget_host,
+                                     const gfx::Size& new_size) {}
+
   // The screen info has changed.
   virtual void ScreenInfoChanged() {}
 
@@ -76,6 +82,11 @@
   // Returns true if the |event| was handled.
   virtual bool PreHandleGestureEvent(const blink::WebGestureEvent& event);
 
+  // Notification the user has made a gesture while focus was on the
+  // page. This is used to avoid uninitiated user downloads (aka carpet
+  // bombing), see DownloadRequestLimiter for details.
+  virtual void OnUserGesture(RenderWidgetHostImpl* render_widget_host) {}
+
   // Notifies that screen rects were sent to renderer process.
   virtual void DidSendScreenRects(RenderWidgetHostImpl* rwh) {}
 
@@ -112,6 +123,27 @@
   // should consume a keyboard input event.
   virtual RenderWidgetHostImpl* GetFocusedRenderWidgetHost();
 
+  // Notification that the renderer has become unresponsive. The
+  // delegate can use this notification to show a warning to the user.
+  virtual void RendererUnresponsive(RenderWidgetHostImpl* render_widget_host) {}
+
+  // Notification that a previously unresponsive renderer has become
+  // responsive again. The delegate can use this notification to end the
+  // warning shown to the user.
+  virtual void RendererResponsive(RenderWidgetHostImpl* render_widget_host) {}
+
+  // Requests to lock the mouse. Once the request is approved or rejected,
+  // GotResponseToLockMouseRequest() will be called on the requesting render
+  // widget host.
+  virtual void RequestToLockMouse(RenderWidgetHostImpl* render_widget_host,
+                                  bool user_gesture,
+                                  bool last_unlocked_by_target) {}
+
+  // Return the rect where to display the resize corner, if any, otherwise
+  // an empty rect.
+  virtual gfx::Rect GetRootWindowResizerRect(
+      RenderWidgetHostImpl* render_widget_host) const;
+
 #if defined(OS_WIN)
   virtual gfx::NativeViewAccessible GetParentNativeViewAccessible();
 #endif
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 62103fd..dd3da41 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -573,7 +573,8 @@
   *resize_params = ViewMsg_Resize_Params();
 
   GetWebScreenInfo(&resize_params->screen_info);
-  resize_params->resizer_rect = GetRootWindowResizerRect();
+  if (delegate_)
+    resize_params->resizer_rect = delegate_->GetRootWindowResizerRect(this);
 
   if (view_) {
     resize_params->new_size = view_->GetRequestedRendererSize();
@@ -1104,7 +1105,8 @@
   if (key_event.type == WebKeyboardEvent::Char &&
       (key_event.windowsKeyCode == ui::VKEY_RETURN ||
        key_event.windowsKeyCode == ui::VKEY_SPACE)) {
-    OnUserGesture();
+    if (delegate_)
+      delegate_->OnUserGesture(this);
   }
 
   // Double check the type to make sure caller hasn't sent us nonsense that
@@ -1375,17 +1377,6 @@
             std::vector<blink::WebCompositionUnderline>(), 0, 0));
 }
 
-gfx::Rect RenderWidgetHostImpl::GetRootWindowResizerRect() const {
-  return gfx::Rect();
-}
-
-void RenderWidgetHostImpl::RequestToLockMouse(bool user_gesture,
-                                              bool last_unlocked_by_target) {
-  // Directly reject to lock the mouse. Subclass can override this method to
-  // decide whether to allow mouse lock or not.
-  GotResponseToLockMouseRequest(false);
-}
-
 void RenderWidgetHostImpl::RejectMouseLockOrUnlockIfNecessary() {
   DCHECK(!pending_mouse_lock_request_ || !IsMouseLocked());
   if (pending_mouse_lock_request_) {
@@ -1440,13 +1431,15 @@
       Source<RenderWidgetHost>(this),
       NotificationService::NoDetails());
   is_unresponsive_ = true;
-  NotifyRendererUnresponsive();
+  if (delegate_)
+    delegate_->RendererUnresponsive(this);
 }
 
 void RenderWidgetHostImpl::RendererIsResponsive() {
   if (is_unresponsive_) {
     is_unresponsive_ = false;
-    NotifyRendererResponsive();
+    if (delegate_)
+      delegate_->RendererResponsive(this);
   }
 }
 
@@ -1744,7 +1737,13 @@
     // Directly approve to lock the mouse.
     GotResponseToLockMouseRequest(true);
   } else {
-    RequestToLockMouse(user_gesture, last_unlocked_by_target);
+    if (delegate_) {
+      delegate_->RequestToLockMouse(this, user_gesture,
+                                    last_unlocked_by_target);
+      return;
+    }
+    // If there's no delegate, just reject it.
+    GotResponseToLockMouseRequest(false);
   }
 }
 
@@ -1860,7 +1859,8 @@
 
   if (event.type == WebInputEvent::MouseDown ||
       event.type == WebInputEvent::GestureTapDown) {
-    OnUserGesture();
+    if (delegate_)
+      delegate_->OnUserGesture(this);
   }
 
   if (delegate_) {
@@ -2001,10 +2001,6 @@
   return ignore_input_events_ || process_->IgnoreInputEvents();
 }
 
-void RenderWidgetHostImpl::StartUserGesture() {
-  OnUserGesture();
-}
-
 void RenderWidgetHostImpl::SetBackgroundOpaque(bool opaque) {
   Send(new ViewMsg_SetBackgroundOpaque(GetRoutingID(), opaque));
 }
@@ -2085,7 +2081,8 @@
   if (!auto_resize_enabled_)
     return;
 
-  OnRenderAutoResized(new_size);
+  if (delegate_)
+    delegate_->ResizeDueToAutoResize(this, new_size);
 }
 
 void RenderWidgetHostImpl::DetachDelegate() {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 29a96ae..d8f07a3 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -347,10 +347,6 @@
   // Cancels an ongoing composition.
   void ImeCancelComposition();
 
-  // This is for derived classes to give us access to the resizer rect.
-  // And to also expose it to the RenderWidgetHostView.
-  virtual gfx::Rect GetRootWindowResizerRect() const;
-
   bool ignore_input_events() const {
     return ignore_input_events_;
   }
@@ -361,10 +357,6 @@
 
   bool has_touch_handler() const { return has_touch_handler_; }
 
-  // Notification that the user has made some kind of input that could
-  // perform an action. See OnUserGesture for more details.
-  void StartUserGesture();
-
   // Set the RenderView background transparency.
   void SetBackgroundOpaque(bool opaque);
 
@@ -520,32 +512,12 @@
   // Called when a mousewheel event was not processed by the renderer.
   virtual void UnhandledWheelEvent(const blink::WebMouseWheelEvent& event) {}
 
-  // Notification that the user has made some kind of input that could
-  // perform an action. The gestures that count are 1) any mouse down
-  // event and 2) enter or space key presses.
-  virtual void OnUserGesture() {}
-
-  // Callbacks for notification when the renderer becomes unresponsive to user
-  // input events, and subsequently responsive again.
-  virtual void NotifyRendererUnresponsive() {}
-  virtual void NotifyRendererResponsive() {}
-
   // Callback for notification that we failed to receive any rendered graphics
   // from a newly loaded page. Used for testing.
   virtual void NotifyNewContentRenderingTimeoutForTesting() {}
 
-  // Called when auto-resize resulted in the renderer size changing.
-  virtual void OnRenderAutoResized(const gfx::Size& new_size) {}
-
   // ---------------------------------------------------------------------------
 
-  // RenderViewHost overrides this method to impose further restrictions on when
-  // to allow mouse lock.
-  // Once the request is approved or rejected, GotResponseToLockMouseRequest()
-  // will be called.
-  virtual void RequestToLockMouse(bool user_gesture,
-                                  bool last_unlocked_by_target);
-
   bool IsMouseLocked() const;
 
   // RenderViewHost overrides this method to report whether tab-initiated
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 9d95b9a..01e9fa9c 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -152,7 +152,6 @@
             process,
             routing_id,
             false),
-        unresponsive_timer_fired_(false),
         new_content_rendering_timeout_fired_(false) {
     acked_touch_event_type_ = blink::WebInputEvent::Undefined;
   }
@@ -174,10 +173,6 @@
     RenderWidgetHostImpl::OnTouchEventAck(event, ack_result);
   }
 
-  bool unresponsive_timer_fired() const {
-    return unresponsive_timer_fired_;
-  }
-
   bool new_content_rendering_timeout_fired() const {
     return new_content_rendering_timeout_fired_;
   }
@@ -200,15 +195,10 @@
   }
 
  protected:
-  void NotifyRendererUnresponsive() override {
-    unresponsive_timer_fired_ = true;
-  }
-
   void NotifyNewContentRenderingTimeoutForTesting() override {
     new_content_rendering_timeout_fired_ = true;
   }
 
-  bool unresponsive_timer_fired_;
   bool new_content_rendering_timeout_fired_;
   WebInputEvent::Type acked_touch_event_type_;
 
@@ -349,7 +339,8 @@
         unhandled_keyboard_event_called_(false),
         unhandled_keyboard_event_type_(WebInputEvent::Undefined),
         handle_wheel_event_(false),
-        handle_wheel_event_called_(false) {}
+        handle_wheel_event_called_(false),
+        unresponsive_timer_fired_(false) {}
   ~MockRenderWidgetHostDelegate() override {}
 
   // Tests that make sure we ignore keyboard event acknowledgments to events we
@@ -384,6 +375,8 @@
 
   bool handle_wheel_event_called() const { return handle_wheel_event_called_; }
 
+  bool unresponsive_timer_fired() const { return unresponsive_timer_fired_; }
+
  protected:
   bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
                               bool* is_keyboard_shortcut) override {
@@ -403,6 +396,10 @@
     return handle_wheel_event_;
   }
 
+  void RendererUnresponsive(RenderWidgetHostImpl* render_widget_host) override {
+    unresponsive_timer_fired_ = true;
+  }
+
   void Cut() override {}
   void Copy() override {}
   void Paste() override {}
@@ -419,6 +416,8 @@
 
   bool handle_wheel_event_;
   bool handle_wheel_event_called_;
+
+  bool unresponsive_timer_fired_;
 };
 
 // RenderWidgetHostTest --------------------------------------------------------
@@ -1066,7 +1065,7 @@
   host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10));
 
   // Immediately try to add a long 30 second timeout.
-  EXPECT_FALSE(host_->unresponsive_timer_fired());
+  EXPECT_FALSE(delegate_->unresponsive_timer_fired());
   host_->StartHangMonitorTimeout(TimeDelta::FromSeconds(30));
 
   // Wait long enough for first timeout and see if it fired.
@@ -1074,7 +1073,7 @@
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMilliseconds(10));
   base::MessageLoop::current()->Run();
-  EXPECT_TRUE(host_->unresponsive_timer_fired());
+  EXPECT_TRUE(delegate_->unresponsive_timer_fired());
 }
 
 // Test that the hang monitor timer expires properly if it is started, stopped,
@@ -1085,7 +1084,7 @@
   host_->StopHangMonitorTimeout();
 
   // Start it again to ensure it still works.
-  EXPECT_FALSE(host_->unresponsive_timer_fired());
+  EXPECT_FALSE(delegate_->unresponsive_timer_fired());
   host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10));
 
   // Wait long enough for first timeout and see if it fired.
@@ -1093,7 +1092,7 @@
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMilliseconds(40));
   base::MessageLoop::current()->Run();
-  EXPECT_TRUE(host_->unresponsive_timer_fired());
+  EXPECT_TRUE(delegate_->unresponsive_timer_fired());
 }
 
 // Test that the hang monitor timer expires properly if it is started, then
@@ -1103,7 +1102,7 @@
   host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(100));
 
   // Start it again with shorter delay.
-  EXPECT_FALSE(host_->unresponsive_timer_fired());
+  EXPECT_FALSE(delegate_->unresponsive_timer_fired());
   host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(20));
 
   // Wait long enough for the second timeout and see if it fired.
@@ -1111,7 +1110,7 @@
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMilliseconds(25));
   base::MessageLoop::current()->Run();
-  EXPECT_TRUE(host_->unresponsive_timer_fired());
+  EXPECT_TRUE(delegate_->unresponsive_timer_fired());
 }
 
 // Test that the hang monitor timer is effectively disabled when the widget is
@@ -1124,12 +1123,12 @@
   host_->WasHidden();
 
   // The timeout should not fire.
-  EXPECT_FALSE(host_->unresponsive_timer_fired());
+  EXPECT_FALSE(delegate_->unresponsive_timer_fired());
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMicroseconds(2));
   base::MessageLoop::current()->Run();
-  EXPECT_FALSE(host_->unresponsive_timer_fired());
+  EXPECT_FALSE(delegate_->unresponsive_timer_fired());
 
   // The timeout should never reactivate while hidden.
   SimulateMouseEvent(WebInputEvent::MouseMove, 10, 10, 0, false);
@@ -1137,7 +1136,7 @@
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMicroseconds(2));
   base::MessageLoop::current()->Run();
-  EXPECT_FALSE(host_->unresponsive_timer_fired());
+  EXPECT_FALSE(delegate_->unresponsive_timer_fired());
 
   // Showing the widget should restore the timeout, as the events have
   // not yet been ack'ed.
@@ -1146,7 +1145,7 @@
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMicroseconds(2));
   base::MessageLoop::current()->Run();
-  EXPECT_TRUE(host_->unresponsive_timer_fired());
+  EXPECT_TRUE(delegate_->unresponsive_timer_fired());
 }
 
 // Test that the hang monitor catches two input events but only one ack.
@@ -1168,7 +1167,7 @@
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMicroseconds(20));
   base::MessageLoop::current()->Run();
-  EXPECT_TRUE(host_->unresponsive_timer_fired());
+  EXPECT_TRUE(delegate_->unresponsive_timer_fired());
 }
 
 // Test that the rendering timeout for newly loaded content fires
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job.cc b/content/browser/service_worker/service_worker_read_from_cache_job.cc
index 6aa92af8..93579911 100644
--- a/content/browser/service_worker/service_worker_read_from_cache_job.cc
+++ b/content/browser/service_worker/service_worker_read_from_cache_job.cc
@@ -41,9 +41,26 @@
 }
 
 void ServiceWorkerReadFromCacheJob::Start() {
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&ServiceWorkerReadFromCacheJob::StartAsync,
-                            weak_factory_.GetWeakPtr()));
+  TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
+                           "ServiceWorkerReadFromCacheJob::ReadInfo", this,
+                           "URL", request_->url().spec());
+  if (!context_) {
+    NotifyStartError(
+        net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
+    return;
+  }
+
+  // Create a response reader and start reading the headers,
+  // we'll continue when thats done.
+  if (is_main_script())
+    version_->embedded_worker()->OnScriptReadStarted();
+  reader_ = context_->storage()->CreateResponseReader(resource_id_);
+  http_info_io_buffer_ = new HttpResponseInfoIOBuffer;
+  reader_->ReadInfo(
+      http_info_io_buffer_.get(),
+      base::Bind(&ServiceWorkerReadFromCacheJob::OnReadInfoComplete,
+                 weak_factory_.GetWeakPtr()));
+  SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
 }
 
 void ServiceWorkerReadFromCacheJob::Kill() {
@@ -105,9 +122,11 @@
     range_requested_ = ranges[0];
 }
 
-int ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf,
-                                               int buf_size) {
+bool ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf,
+                                                int buf_size,
+                                                int* bytes_read) {
   DCHECK_NE(buf_size, 0);
+  DCHECK(bytes_read);
   DCHECK(!reader_->IsReadPending());
   TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
                            "ServiceWorkerReadFromCacheJob::ReadRawData",
@@ -116,31 +135,8 @@
   reader_->ReadData(buf, buf_size,
                     base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete,
                                weak_factory_.GetWeakPtr()));
-  return net::ERR_IO_PENDING;
-}
-
-void ServiceWorkerReadFromCacheJob::StartAsync() {
-  TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
-                           "ServiceWorkerReadFromCacheJob::ReadInfo", this,
-                           "URL", request_->url().spec());
-  if (!context_) {
-    // NotifyStartError is not safe to call synchronously in Start.
-    NotifyStartError(
-        net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
-    return;
-  }
-
-  // Create a response reader and start reading the headers,
-  // we'll continue when thats done.
-  if (is_main_script())
-    version_->embedded_worker()->OnScriptReadStarted();
-  reader_ = context_->storage()->CreateResponseReader(resource_id_);
-  http_info_io_buffer_ = new HttpResponseInfoIOBuffer;
-  reader_->ReadInfo(
-      http_info_io_buffer_.get(),
-      base::Bind(&ServiceWorkerReadFromCacheJob::OnReadInfoComplete,
-                 weak_factory_.GetWeakPtr()));
   SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+  return false;
 }
 
 const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const {
@@ -158,8 +154,6 @@
     ServiceWorkerMetrics::CountReadResponseResult(
         ServiceWorkerMetrics::READ_HEADERS_ERROR);
     Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
-    NotifyStartError(
-        net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
     return;
   }
   DCHECK_GE(result, 0);
@@ -213,22 +207,23 @@
   }
   if (is_main_script())
     version_->embedded_worker()->OnScriptReadFinished();
+  NotifyDone(status);
 }
 
 void ServiceWorkerReadFromCacheJob::OnReadComplete(int result) {
   ServiceWorkerMetrics::ReadResponseResult check_result;
-
-  if (result >= 0) {
+  if (result == 0) {
     check_result = ServiceWorkerMetrics::READ_OK;
-    if (result == 0)
-      Done(net::URLRequestStatus());
-  } else {
+    Done(net::URLRequestStatus());
+  } else if (result < 0) {
     check_result = ServiceWorkerMetrics::READ_DATA_ERROR;
     Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+  } else {
+    check_result = ServiceWorkerMetrics::READ_OK;
+    SetStatus(net::URLRequestStatus());  // Clear the IO_PENDING status
   }
-
   ServiceWorkerMetrics::CountReadResponseResult(check_result);
-  ReadRawDataComplete(result);
+  NotifyReadComplete(result);
   TRACE_EVENT_ASYNC_END1("ServiceWorker",
                          "ServiceWorkerReadFromCacheJob::ReadRawData",
                          this,
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job.h b/content/browser/service_worker/service_worker_read_from_cache_job.h
index a62893d..fccde7a 100644
--- a/content/browser/service_worker/service_worker_read_from_cache_job.h
+++ b/content/browser/service_worker/service_worker_read_from_cache_job.h
@@ -51,14 +51,13 @@
   void GetResponseInfo(net::HttpResponseInfo* info) override;
   int GetResponseCode() const override;
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   // Reader completion callbacks.
   void OnReadInfoComplete(int result);
   void OnReadComplete(int result);
 
   // Helpers
-  void StartAsync();
   const net::HttpResponseInfo* http_info() const;
   bool is_range_request() const { return range_requested_.IsValid(); }
   void SetupRangeResponse(int response_data_size);
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index 7e7c699..3948ee9 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -203,44 +203,50 @@
     byte_range_ = ranges[0];
 }
 
-int ServiceWorkerURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
+bool ServiceWorkerURLRequestJob::ReadRawData(net::IOBuffer* buf,
+                                             int buf_size,
+                                             int* bytes_read) {
   DCHECK(buf);
   DCHECK_GE(buf_size, 0);
+  DCHECK(bytes_read);
   DCHECK(waiting_stream_url_.is_empty());
-
-  int bytes_read = 0;
-
   if (stream_.get()) {
-    switch (stream_->ReadRawData(buf, buf_size, &bytes_read)) {
+    switch (stream_->ReadRawData(buf, buf_size, bytes_read)) {
       case Stream::STREAM_HAS_DATA:
-        DCHECK_GT(bytes_read, 0);
-        return bytes_read;
+        DCHECK_GT(*bytes_read, 0);
+        return true;
       case Stream::STREAM_COMPLETE:
-        DCHECK_EQ(0, bytes_read);
+        DCHECK(!*bytes_read);
         RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE);
-        return 0;
+        return true;
       case Stream::STREAM_EMPTY:
         stream_pending_buffer_ = buf;
         stream_pending_buffer_size_ = buf_size;
-        return net::ERR_IO_PENDING;
+        SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+        return false;
       case Stream::STREAM_ABORTED:
         // Handle this as connection reset.
         RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED);
-        return net::ERR_CONNECTION_RESET;
+        NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                         net::ERR_CONNECTION_RESET));
+        return false;
     }
     NOTREACHED();
-    return net::ERR_FAILED;
+    return false;
   }
 
-  if (!blob_request_)
-    return 0;
-  blob_request_->Read(buf, buf_size, &bytes_read);
+  if (!blob_request_) {
+    *bytes_read = 0;
+    return true;
+  }
+  blob_request_->Read(buf, buf_size, bytes_read);
   net::URLRequestStatus status = blob_request_->status();
-  if (status.status() != net::URLRequestStatus::SUCCESS)
-    return status.error();
-  if (bytes_read == 0)
+  SetStatus(status);
+  if (status.is_io_pending())
+    return false;
+  if (status.is_success() && *bytes_read == 0)
     RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
-  return bytes_read;
+  return status.is_success();
 }
 
 // TODO(falken): Refactor Blob and Stream specific handling to separate classes.
@@ -286,18 +292,29 @@
 
 void ServiceWorkerURLRequestJob::OnReadCompleted(net::URLRequest* request,
                                                  int bytes_read) {
+  SetStatus(request->status());
   if (!request->status().is_success()) {
     RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ);
-  } else if (bytes_read == 0) {
-    RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
+    NotifyDone(request->status());
+    return;
   }
-  net::URLRequestStatus status = request->status();
-  ReadRawDataComplete(status.is_success() ? bytes_read : status.error());
+
+  if (bytes_read == 0) {
+    // Protect because NotifyReadComplete() can destroy |this|.
+    scoped_refptr<ServiceWorkerURLRequestJob> protect(this);
+    RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
+    NotifyReadComplete(bytes_read);
+    NotifyDone(request->status());
+    return;
+  }
+  NotifyReadComplete(bytes_read);
 }
 
 // Overrides for Stream reading -----------------------------------------------
 
 void ServiceWorkerURLRequestJob::OnDataAvailable(Stream* stream) {
+  // Clear the IO_PENDING status.
+  SetStatus(net::URLRequestStatus());
   // Do nothing if stream_pending_buffer_ is empty, i.e. there's no ReadRawData
   // operation waiting for IO completion.
   if (!stream_pending_buffer_.get())
@@ -306,15 +323,15 @@
   // stream_pending_buffer_ is set to the IOBuffer instance provided to
   // ReadRawData() by URLRequestJob.
 
-  int result = 0;
+  int bytes_read = 0;
   switch (stream_->ReadRawData(stream_pending_buffer_.get(),
-                               stream_pending_buffer_size_, &result)) {
+                               stream_pending_buffer_size_, &bytes_read)) {
     case Stream::STREAM_HAS_DATA:
-      DCHECK_GT(result, 0);
+      DCHECK_GT(bytes_read, 0);
       break;
     case Stream::STREAM_COMPLETE:
       // Calling NotifyReadComplete with 0 signals completion.
-      DCHECK(!result);
+      DCHECK(!bytes_read);
       RecordResult(ServiceWorkerMetrics::REQUEST_JOB_STREAM_RESPONSE);
       break;
     case Stream::STREAM_EMPTY:
@@ -322,8 +339,9 @@
       break;
     case Stream::STREAM_ABORTED:
       // Handle this as connection reset.
-      result = net::ERR_CONNECTION_RESET;
       RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_STREAM_ABORTED);
+      NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                       net::ERR_CONNECTION_RESET));
       break;
   }
 
@@ -331,7 +349,7 @@
   // safe for the observer to read.
   stream_pending_buffer_ = nullptr;
   stream_pending_buffer_size_ = 0;
-  ReadRawDataComplete(result);
+  NotifyReadComplete(bytes_read);
 }
 
 void ServiceWorkerURLRequestJob::OnStreamRegistered(Stream* stream) {
@@ -627,7 +645,7 @@
   // error.
   if (response.status_code == 0) {
     RecordStatusZeroResponseError(response.error);
-    NotifyStartError(
+    NotifyDone(
         net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
     return;
   }
diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h
index 2a50c94..4815c0b 100644
--- a/content/browser/service_worker/service_worker_url_request_job.h
+++ b/content/browser/service_worker/service_worker_url_request_job.h
@@ -87,7 +87,7 @@
   void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const override;
   int GetResponseCode() const override;
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   // net::URLRequest::Delegate overrides that read the blob from the
   // ServiceWorkerFetchResponse.
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 8519375..47cf5ef 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -801,6 +801,7 @@
 
 void ServiceWorkerVersion::DispatchSyncEvent(
     BackgroundSyncRegistrationHandle::HandleId handle_id,
+    BackgroundSyncEventLastChance last_chance,
     const StatusCallback& callback) {
   OnBeginEvent();
   DCHECK_EQ(ACTIVATED, status()) << status();
@@ -809,7 +810,7 @@
     StartWorker(base::Bind(
         &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), callback,
         base::Bind(&self::DispatchSyncEvent, weak_factory_.GetWeakPtr(),
-                   handle_id, callback)));
+                   handle_id, last_chance, callback)));
     return;
   }
 
@@ -823,8 +824,9 @@
   }
 
   background_sync_dispatcher_->Sync(
-      handle_id, base::Bind(&self::OnSyncEventFinished,
-                            weak_factory_.GetWeakPtr(), request_id));
+      handle_id, last_chance,
+      base::Bind(&self::OnSyncEventFinished, weak_factory_.GetWeakPtr(),
+                 request_id));
 }
 
 void ServiceWorkerVersion::DispatchNotificationClickEvent(
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index 6cf9ca4..3d474b72 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -218,6 +218,7 @@
   //
   // This must be called when the status() is ACTIVATED.
   void DispatchSyncEvent(BackgroundSyncRegistrationHandle::HandleId handle_id,
+                         BackgroundSyncEventLastChance last_chance,
                          const StatusCallback& callback);
 
   // Sends notificationclick event to the associated embedded worker and
diff --git a/content/browser/service_worker/service_worker_write_to_cache_job.cc b/content/browser/service_worker/service_worker_write_to_cache_job.cc
index 0cc9f88..fdd2867 100644
--- a/content/browser/service_worker/service_worker_write_to_cache_job.cc
+++ b/content/browser/service_worker/service_worker_write_to_cache_job.cc
@@ -7,7 +7,6 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/strings/stringprintf.h"
-#include "base/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/service_worker/service_worker_cache_writer.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
@@ -48,7 +47,7 @@
 // developers.
 // TODO(falken): Redesign this class so we don't have to fail at the network
 // stack layer just to cancel the update.
-const net::Error kIdenticalScriptError = net::ERR_FILE_EXISTS;
+const int kIdenticalScriptError = net::ERR_FILE_EXISTS;
 
 }  // namespace
 
@@ -80,18 +79,11 @@
 }
 
 void ServiceWorkerWriteToCacheJob::Start() {
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&ServiceWorkerWriteToCacheJob::StartAsync,
-                            weak_factory_.GetWeakPtr()));
-}
-
-void ServiceWorkerWriteToCacheJob::StartAsync() {
   TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
                            "ServiceWorkerWriteToCacheJob::ExecutingJob",
                            this,
                            "URL", request_->url().spec());
   if (!context_) {
-    // NotifyStartError is not safe to call synchronously in Start().
     NotifyStartError(
         net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
     return;
@@ -116,9 +108,8 @@
   has_been_killed_ = true;
   net_request_.reset();
   if (did_notify_started_) {
-    net::Error error = NotifyFinishedCaching(
-        net::URLRequestStatus::FromError(net::ERR_ABORTED), kKilledError);
-    DCHECK_EQ(net::ERR_ABORTED, error);
+    NotifyFinishedCaching(net::URLRequestStatus::FromError(net::ERR_ABORTED),
+                          kKilledError);
   }
   writer_.reset();
   context_.reset();
@@ -165,20 +156,40 @@
   net_request_->SetExtraRequestHeaders(headers);
 }
 
-int ServiceWorkerWriteToCacheJob::ReadRawData(net::IOBuffer* buf,
-                                              int buf_size) {
-  int bytes_read = 0;
-  net::URLRequestStatus status = ReadNetData(buf, buf_size, &bytes_read);
+bool ServiceWorkerWriteToCacheJob::ReadRawData(net::IOBuffer* buf,
+                                               int buf_size,
+                                               int* bytes_read) {
+  net::URLRequestStatus status = ReadNetData(buf, buf_size, bytes_read);
+  SetStatus(status);
   if (status.is_io_pending())
-    return net::ERR_IO_PENDING;
+    return false;
 
   if (!status.is_success()) {
-    net::Error error = NotifyFinishedCaching(status, kFetchScriptError);
-    DCHECK_EQ(status.error(), error);
-    return error;
+    NotifyDoneHelper(status, kFetchScriptError);
+    return false;
   }
 
-  return HandleNetData(bytes_read);
+  HandleNetData(*bytes_read);
+  status = GetStatus();
+
+  // Synchronous EOFs that do not replace the incumbent entry are considered
+  // failures. Since normally the URLRequestJob's status would be set by
+  // ReadNetData or HandleNetData, this code has to manually fix up the status
+  // to match the failure this function is about to return.
+  if (status.status() == net::URLRequestStatus::SUCCESS && *bytes_read == 0 &&
+      !cache_writer_->did_replace()) {
+    status = net::URLRequestStatus::FromError(kIdenticalScriptError);
+  }
+
+  if (!status.is_success()) {
+    NotifyDoneHelper(status, "");
+    return false;
+  }
+
+  // Since URLRequestStatus::is_success() means "SUCCESS or IO_PENDING", but the
+  // contract of this function is "return true for synchronous successes only",
+  // it is important to test against SUCCESS explicitly here.
+  return status.status() == net::URLRequestStatus::SUCCESS;
 }
 
 const net::HttpResponseInfo* ServiceWorkerWriteToCacheJob::http_info() const {
@@ -233,9 +244,9 @@
   TRACE_EVENT0("ServiceWorker",
                "ServiceWorkerWriteToCacheJob::OnReceivedRedirect");
   // Script resources can't redirect.
-  NotifyStartErrorHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                               net::ERR_UNSAFE_REDIRECT),
-                         kRedirectError);
+  NotifyDoneHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                         net::ERR_UNSAFE_REDIRECT),
+                   kRedirectError);
 }
 
 void ServiceWorkerWriteToCacheJob::OnAuthRequired(
@@ -245,7 +256,7 @@
   TRACE_EVENT0("ServiceWorker",
                "ServiceWorkerWriteToCacheJob::OnAuthRequired");
   // TODO(michaeln): Pass this thru to our jobs client.
-  NotifyStartErrorHelper(
+  NotifyDoneHelper(
       net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED),
       kClientAuthenticationError);
 }
@@ -258,7 +269,7 @@
                "ServiceWorkerWriteToCacheJob::OnCertificateRequested");
   // TODO(michaeln): Pass this thru to our jobs client.
   // see NotifyCertificateRequested.
-  NotifyStartErrorHelper(
+  NotifyDoneHelper(
       net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED),
       kClientAuthenticationError);
 }
@@ -272,9 +283,9 @@
                "ServiceWorkerWriteToCacheJob::OnSSLCertificateError");
   // TODO(michaeln): Pass this thru to our jobs client,
   // see NotifySSLCertificateError.
-  NotifyStartErrorHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                               net::ERR_INSECURE_RESPONSE),
-                         kSSLError);
+  NotifyDoneHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                         net::ERR_INSECURE_RESPONSE),
+                   kSSLError);
 }
 
 void ServiceWorkerWriteToCacheJob::OnBeforeNetworkStart(
@@ -290,15 +301,15 @@
     net::URLRequest* request) {
   DCHECK_EQ(net_request_, request);
   if (!request->status().is_success()) {
-    NotifyStartErrorHelper(request->status(), kFetchScriptError);
+    NotifyDoneHelper(request->status(), kFetchScriptError);
     return;
   }
   if (request->GetResponseCode() / 100 != 2) {
     std::string error_message =
         base::StringPrintf(kBadHTTPResponseError, request->GetResponseCode());
-    NotifyStartErrorHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                                 net::ERR_INVALID_RESPONSE),
-                           error_message);
+    NotifyDoneHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                           net::ERR_INVALID_RESPONSE),
+                     error_message);
     // TODO(michaeln): Instead of error'ing immediately, send the net
     // response to our consumer, just don't cache it?
     return;
@@ -309,10 +320,9 @@
     const net::HttpNetworkSession::Params* session_params =
         request->context()->GetNetworkSessionParams();
     if (!session_params || !session_params->ignore_certificate_errors) {
-      NotifyStartErrorHelper(
-          net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                net::ERR_INSECURE_RESPONSE),
-          kSSLError);
+      NotifyDoneHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                             net::ERR_INSECURE_RESPONSE),
+                       kSSLError);
       return;
     }
   }
@@ -327,10 +337,9 @@
           mime_type.empty()
               ? kNoMIMEError
               : base::StringPrintf(kBadMIMEError, mime_type.c_str());
-      NotifyStartErrorHelper(
-          net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                net::ERR_INSECURE_RESPONSE),
-          error_message);
+      NotifyDoneHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                             net::ERR_INSECURE_RESPONSE),
+                       error_message);
       return;
     }
 
@@ -366,31 +375,52 @@
   NotifyHeadersComplete();
 }
 
+void ServiceWorkerWriteToCacheJob::HandleNetData(int bytes_read) {
+  io_buffer_bytes_ = bytes_read;
+  net::Error error = cache_writer_->MaybeWriteData(
+      io_buffer_.get(), bytes_read,
+      base::Bind(&ServiceWorkerWriteToCacheJob::OnWriteDataComplete,
+                 weak_factory_.GetWeakPtr()));
+  SetStatus(net::URLRequestStatus::FromError(error));
+
+  // In case of ERR_IO_PENDING, this logic is done in OnWriteDataComplete.
+  if (error != net::ERR_IO_PENDING && bytes_read == 0) {
+    NotifyFinishedCaching(net::URLRequestStatus::FromError(error),
+                          std::string());
+  }
+}
+
 void ServiceWorkerWriteToCacheJob::OnWriteDataComplete(net::Error error) {
   SetStatus(net::URLRequestStatus::FromError(error));
   DCHECK_NE(net::ERR_IO_PENDING, error);
-  if (io_buffer_bytes_ == 0)
-    error = NotifyFinishedCaching(net::URLRequestStatus::FromError(error), "");
-  ReadRawDataComplete(error == net::OK ? io_buffer_bytes_ : error);
+  if (io_buffer_bytes_ == 0) {
+    NotifyDoneHelper(net::URLRequestStatus::FromError(error), std::string());
+  }
+  NotifyReadComplete(error == net::OK ? io_buffer_bytes_ : error);
 }
 
 void ServiceWorkerWriteToCacheJob::OnReadCompleted(net::URLRequest* request,
-                                                   int result) {
+                                                   int bytes_read) {
   DCHECK_EQ(net_request_, request);
-  DCHECK_NE(result, net::ERR_IO_PENDING);
-
-  if (result < 0) {
+  if (bytes_read < 0) {
     DCHECK(!request->status().is_success());
-    result = NotifyFinishedCaching(request->status(), kFetchScriptError);
-  } else {
-    result = HandleNetData(result);
-  }
-
-  // ReadRawDataComplete will be called in OnWriteDataComplete, so return early.
-  if (result == net::ERR_IO_PENDING)
+    NotifyDoneHelper(request->status(), kFetchScriptError);
     return;
-
-  ReadRawDataComplete(result);
+  }
+  HandleNetData(bytes_read);
+  // HandleNetData can cause status of this job to change. If the status changes
+  // to IO_PENDING, that means HandleNetData has pending IO, and
+  // NotifyReadComplete will be called later by the appropriate callback.
+  if (!GetStatus().is_io_pending()) {
+    int result = GetStatus().status() == net::URLRequestStatus::SUCCESS
+                     ? bytes_read
+                     : GetStatus().error();
+    // If bytes_read is 0, HandleNetData synchronously completed and this job is
+    // at EOF.
+    if (bytes_read == 0)
+      NotifyDoneHelper(GetStatus(), std::string());
+    NotifyReadComplete(result);
+  }
 }
 
 bool ServiceWorkerWriteToCacheJob::CheckPathRestriction(
@@ -404,57 +434,43 @@
   if (!ServiceWorkerUtils::IsPathRestrictionSatisfied(
           version_->scope(), url_,
           has_header ? &service_worker_allowed : nullptr, &error_message)) {
-    NotifyStartErrorHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                                 net::ERR_INSECURE_RESPONSE),
-                           error_message);
+    NotifyDoneHelper(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                           net::ERR_INSECURE_RESPONSE),
+                     error_message);
     return false;
   }
   return true;
 }
 
-int ServiceWorkerWriteToCacheJob::HandleNetData(int bytes_read) {
-  io_buffer_bytes_ = bytes_read;
-  net::Error error = cache_writer_->MaybeWriteData(
-      io_buffer_.get(), bytes_read,
-      base::Bind(&ServiceWorkerWriteToCacheJob::OnWriteDataComplete,
-                 weak_factory_.GetWeakPtr()));
-
-  // In case of ERR_IO_PENDING, this logic is done in OnWriteDataComplete.
-  if (error != net::ERR_IO_PENDING && bytes_read == 0) {
-    error = NotifyFinishedCaching(net::URLRequestStatus::FromError(error),
-                                  std::string());
-  }
-  return error == net::OK ? bytes_read : error;
-}
-
-void ServiceWorkerWriteToCacheJob::NotifyStartErrorHelper(
+void ServiceWorkerWriteToCacheJob::NotifyDoneHelper(
     const net::URLRequestStatus& status,
     const std::string& status_message) {
   DCHECK(!status.is_io_pending());
 
-  net::Error error = NotifyFinishedCaching(status, status_message);
-  // The special case mentioned in NotifyFinishedCaching about script being
-  // identical does not apply here, since the entire body needs to be read
-  // before this is relevant.
-  DCHECK_EQ(status.error(), error);
+  // Note that NotifyFinishedCaching has logic in it to detect the special case
+  // mentioned below as well.
+  NotifyFinishedCaching(status, status_message);
 
   net::URLRequestStatus reported_status = status;
   std::string reported_status_message = status_message;
 
+  // A strange special case: requests that successfully fetch the entire
+  // ServiceWorker and write it back, but which did not replace the incumbent
+  // script because the new script was identical, are considered to have failed.
+  if (status.is_success() && !cache_writer_->did_replace()) {
+    reported_status = net::URLRequestStatus::FromError(kIdenticalScriptError);
+    reported_status_message = "";
+  }
+
   SetStatus(reported_status);
-  NotifyStartError(reported_status);
+  NotifyDone(reported_status);
 }
 
-net::Error ServiceWorkerWriteToCacheJob::NotifyFinishedCaching(
+void ServiceWorkerWriteToCacheJob::NotifyFinishedCaching(
     net::URLRequestStatus status,
     const std::string& status_message) {
-  net::Error result = static_cast<net::Error>(status.error());
   if (did_notify_finished_)
-    return result;
-
-  int size = -1;
-  if (status.is_success())
-    size = cache_writer_->bytes_written();
+    return;
 
   // If all the calls to MaybeWriteHeaders/MaybeWriteData succeeded, but the
   // incumbent entry wasn't actually replaced because the new entry was
@@ -462,18 +478,17 @@
   // exists.
   if (status.status() == net::URLRequestStatus::SUCCESS &&
       !cache_writer_->did_replace()) {
-    result = kIdenticalScriptError;
-    status = net::URLRequestStatus::FromError(result);
+    status = net::URLRequestStatus::FromError(kIdenticalScriptError);
     version_->SetStartWorkerStatusCode(SERVICE_WORKER_ERROR_EXISTS);
-    version_->script_cache_map()->NotifyFinishedCaching(url_, size, status,
-                                                        std::string());
-  } else {
-    version_->script_cache_map()->NotifyFinishedCaching(url_, size, status,
-                                                        status_message);
   }
 
+  int size = -1;
+  if (status.is_success())
+    size = cache_writer_->bytes_written();
+
+  version_->script_cache_map()->NotifyFinishedCaching(url_, size, status,
+                                                      status_message);
   did_notify_finished_ = true;
-  return result;
 }
 
 scoped_ptr<ServiceWorkerResponseReader>
diff --git a/content/browser/service_worker/service_worker_write_to_cache_job.h b/content/browser/service_worker/service_worker_write_to_cache_job.h
index e614912..92272399 100644
--- a/content/browser/service_worker/service_worker_write_to_cache_job.h
+++ b/content/browser/service_worker/service_worker_write_to_cache_job.h
@@ -64,7 +64,6 @@
 
   // net::URLRequestJob overrides
   void Start() override;
-  void StartAsync();
   void Kill() override;
   net::LoadState GetLoadState() const override;
   bool GetCharset(std::string* charset) override;
@@ -72,7 +71,7 @@
   void GetResponseInfo(net::HttpResponseInfo* info) override;
   int GetResponseCode() const override;
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   const net::HttpResponseInfo* http_info() const;
 
@@ -110,22 +109,18 @@
   bool CheckPathRestriction(net::URLRequest* request);
 
   // Writes network data back to the script cache if needed, and notifies the
-  // script cache of fetch completion at EOF. This function returns
-  // net::IO_PENDING if the IO is to be completed asynchronously, returns a
-  // negative number that represents a corresponding net error code (other than
-  // net::IO_PENDING) if an error occurred, or returns a non-negative number
-  // that represents the number of network bytes read. If the return value is
-  // non-negative, all of the data in |io_buffer_| has been written back to the
-  // script cache if necessary.
-  int HandleNetData(int bytes_read);
+  // script cache of fetch completion at EOF. This function might need to do
+  // asynchronous IO; if so, it signals this through setting the URLRequestJob's
+  // status to IO_PENDING. After this function returns, if the URLRequestJob
+  // isn't IO_PENDING, all of the data in |io_buffer_| has been written back to
+  // the script cache if necessary.
+  void HandleNetData(int bytes_read);
 
-  void NotifyStartErrorHelper(const net::URLRequestStatus& status,
-                              const std::string& status_message);
+  void NotifyDoneHelper(const net::URLRequestStatus& status,
+                        const std::string& status_message);
 
-  // Returns an error code that is passed in through |status| or a new one if an
-  // additional error is found.
-  net::Error NotifyFinishedCaching(net::URLRequestStatus status,
-                                   const std::string& status_message);
+  void NotifyFinishedCaching(net::URLRequestStatus status,
+                             const std::string& status_message);
 
   scoped_ptr<ServiceWorkerResponseReader> CreateCacheResponseReader();
   scoped_ptr<ServiceWorkerResponseWriter> CreateCacheResponseWriter();
@@ -145,7 +140,6 @@
   bool has_been_killed_;
   bool did_notify_started_;
   bool did_notify_finished_;
-
   base::WeakPtrFactory<ServiceWorkerWriteToCacheJob> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWriteToCacheJob);
diff --git a/content/browser/streams/stream_url_request_job.cc b/content/browser/streams/stream_url_request_job.cc
index e26fe35..0392d108f 100644
--- a/content/browser/streams/stream_url_request_job.cc
+++ b/content/browser/streams/stream_url_request_job.cc
@@ -40,6 +40,8 @@
 }
 
 void StreamURLRequestJob::OnDataAvailable(Stream* stream) {
+  // Clear the IO_PENDING status.
+  SetStatus(net::URLRequestStatus());
   // Do nothing if pending_buffer_ is empty, i.e. there's no ReadRawData()
   // operation waiting for IO completion.
   if (!pending_buffer_.get())
@@ -48,22 +50,24 @@
   // pending_buffer_ is set to the IOBuffer instance provided to ReadRawData()
   // by URLRequestJob.
 
-  int result = 0;
+  int bytes_read;
   switch (stream_->ReadRawData(pending_buffer_.get(), pending_buffer_size_,
-                               &result)) {
+                               &bytes_read)) {
     case Stream::STREAM_HAS_DATA:
-      DCHECK_GT(result, 0);
+      DCHECK_GT(bytes_read, 0);
       break;
     case Stream::STREAM_COMPLETE:
-      // Ensure ReadRawData gives net::OK.
-      DCHECK_EQ(net::OK, result);
+      // Ensure this. Calling NotifyReadComplete call with 0 signals
+      // completion.
+      bytes_read = 0;
       break;
     case Stream::STREAM_EMPTY:
       NOTREACHED();
       break;
     case Stream::STREAM_ABORTED:
       // Handle this as connection reset.
-      result = net::ERR_CONNECTION_RESET;
+      NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                       net::ERR_CONNECTION_RESET));
       break;
   }
 
@@ -72,9 +76,8 @@
   pending_buffer_ = NULL;
   pending_buffer_size_ = 0;
 
-  if (result > 0)
-    total_bytes_read_ += result;
-  ReadRawDataComplete(result);
+  total_bytes_read_ += bytes_read;
+  NotifyReadComplete(bytes_read);
 }
 
 // net::URLRequestJob methods.
@@ -91,40 +94,43 @@
   ClearStream();
 }
 
-int StreamURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
-  // TODO(ellyjones): This is not right. The old code returned true here, but
-  // ReadRawData's old contract was to return true only for synchronous
-  // successes, which had the effect of treating all errors as synchronous EOFs.
-  // See https://crbug.com/508957
+bool StreamURLRequestJob::ReadRawData(net::IOBuffer* buf,
+                                      int buf_size,
+                                      int* bytes_read) {
   if (request_failed_)
-    return 0;
+    return true;
 
   DCHECK(buf);
+  DCHECK(bytes_read);
   int to_read = buf_size;
   if (max_range_ && to_read) {
     if (to_read + total_bytes_read_ > max_range_)
       to_read = max_range_ - total_bytes_read_;
 
-    if (to_read == 0)
-      return 0;
+    if (to_read <= 0) {
+      *bytes_read = 0;
+      return true;
+    }
   }
 
-  int bytes_read = 0;
-  switch (stream_->ReadRawData(buf, to_read, &bytes_read)) {
+  switch (stream_->ReadRawData(buf, to_read, bytes_read)) {
     case Stream::STREAM_HAS_DATA:
     case Stream::STREAM_COMPLETE:
-      total_bytes_read_ += bytes_read;
-      return bytes_read;
+      total_bytes_read_ += *bytes_read;
+      return true;
     case Stream::STREAM_EMPTY:
       pending_buffer_ = buf;
       pending_buffer_size_ = to_read;
-      return net::ERR_IO_PENDING;
+      SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+      return false;
     case Stream::STREAM_ABORTED:
       // Handle this as connection reset.
-      return net::ERR_CONNECTION_RESET;
+      NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                       net::ERR_CONNECTION_RESET));
+      return false;
   }
   NOTREACHED();
-  return net::ERR_FAILED;
+  return false;
 }
 
 bool StreamURLRequestJob::GetMimeType(std::string* mime_type) const {
@@ -183,8 +189,13 @@
 void StreamURLRequestJob::NotifyFailure(int error_code) {
   request_failed_ = true;
 
-  // This method can only be called before headers are set.
-  DCHECK(!headers_set_);
+  // If we already return the headers on success, we can't change the headers
+  // now. Instead, we just error out.
+  if (headers_set_) {
+    NotifyDone(
+        net::URLRequestStatus(net::URLRequestStatus::FAILED, error_code));
+    return;
+  }
 
   // TODO(zork): Share these with BlobURLRequestJob.
   net::HttpStatusCode status_code = net::HTTP_INTERNAL_SERVER_ERROR;
diff --git a/content/browser/streams/stream_url_request_job.h b/content/browser/streams/stream_url_request_job.h
index f22311d..05c9551 100644
--- a/content/browser/streams/stream_url_request_job.h
+++ b/content/browser/streams/stream_url_request_job.h
@@ -29,7 +29,7 @@
   // net::URLRequestJob methods.
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetMimeType(std::string* mime_type) const override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
   int GetResponseCode() const override;
diff --git a/content/browser/tracing/background_tracing_manager_browsertest.cc b/content/browser/tracing/background_tracing_manager_browsertest.cc
index 63aceff..fd526fe3 100644
--- a/content/browser/tracing/background_tracing_manager_browsertest.cc
+++ b/content/browser/tracing/background_tracing_manager_browsertest.cc
@@ -35,7 +35,7 @@
   }
 
   void Upload(const scoped_refptr<base::RefCountedString>& file_contents,
-              scoped_ptr<base::DictionaryValue> metadata,
+              scoped_ptr<const base::DictionaryValue> metadata,
               base::Callback<void()> done_callback) {
     receive_count_ += 1;
     EXPECT_TRUE(file_contents);
diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc
index c347675a..0b9431d 100644
--- a/content/browser/tracing/background_tracing_manager_impl.cc
+++ b/content/browser/tracing/background_tracing_manager_impl.cc
@@ -5,22 +5,17 @@
 #include "content/browser/tracing/background_tracing_manager_impl.h"
 
 #include "base/command_line.h"
-#include "base/cpu.h"
 #include "base/json/json_writer.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
-#include "base/sys_info.h"
 #include "base/time/time.h"
 #include "content/browser/tracing/background_tracing_rule.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/gpu_data_manager.h"
 #include "content/public/browser/tracing_delegate.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
-#include "gpu/config/gpu_info.h"
-#include "net/base/network_change_notifier.h"
 
 namespace content {
 
@@ -49,29 +44,6 @@
                             NUMBER_OF_BACKGROUND_TRACING_METRICS);
 }
 
-std::string GetNetworkTypeString() {
-  switch (net::NetworkChangeNotifier::GetConnectionType()) {
-    case net::NetworkChangeNotifier::CONNECTION_ETHERNET:
-      return "Ethernet";
-    case net::NetworkChangeNotifier::CONNECTION_WIFI:
-      return "WiFi";
-    case net::NetworkChangeNotifier::CONNECTION_2G:
-      return "2G";
-    case net::NetworkChangeNotifier::CONNECTION_3G:
-      return "3G";
-    case net::NetworkChangeNotifier::CONNECTION_4G:
-      return "4G";
-    case net::NetworkChangeNotifier::CONNECTION_NONE:
-      return "None";
-    case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH:
-      return "Bluetooth";
-    case net::NetworkChangeNotifier::CONNECTION_UNKNOWN:
-    default:
-      break;
-  }
-  return "Unknown";
-}
-
 }  // namespace
 
 BackgroundTracingManagerImpl::TracingTimer::TracingTimer(
@@ -426,6 +398,7 @@
 }
 
 void BackgroundTracingManagerImpl::OnFinalizeStarted(
+    scoped_ptr<const base::DictionaryValue> metadata,
     base::RefCountedString* file_contents) {
   CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
 
@@ -435,7 +408,7 @@
 
   if (!receive_callback_.is_null()) {
     receive_callback_.Run(
-        file_contents, GenerateMetadataDict(),
+        file_contents, metadata.Pass(),
         base::Bind(&BackgroundTracingManagerImpl::OnFinalizeComplete,
                    base::Unretained(this)));
   }
@@ -470,72 +443,15 @@
   RecordBackgroundTracingMetric(FINALIZATION_COMPLETE);
 }
 
-scoped_ptr<base::DictionaryValue>
-BackgroundTracingManagerImpl::GenerateMetadataDict() const {
-  // Grab the network type.
-  std::string network_type = GetNetworkTypeString();
+void BackgroundTracingManagerImpl::AddCustomMetadata(
+    TracingControllerImpl::TraceDataSink* trace_data_sink) const {
+  base::DictionaryValue metadata_dict;
 
-  // Grab the product version.
-  std::string product_version = GetContentClient()->GetProduct();
-
-  // Serialize the config into json.
   scoped_ptr<base::DictionaryValue> config_dict(new base::DictionaryValue());
-
   config_->IntoDict(config_dict.get());
+  metadata_dict.Set("config", config_dict.Pass());
 
-  scoped_ptr<base::DictionaryValue> metadata_dict(new base::DictionaryValue());
-  metadata_dict->Set("config", config_dict.Pass());
-  metadata_dict->SetString("network-type", network_type);
-  metadata_dict->SetString("product-version", product_version);
-  metadata_dict->SetString("user-agent", GetContentClient()->GetUserAgent());
-
-  // OS
-  metadata_dict->SetString("os-name", base::SysInfo::OperatingSystemName());
-  metadata_dict->SetString("os-version",
-                           base::SysInfo::OperatingSystemVersion());
-  metadata_dict->SetString("os-arch",
-                           base::SysInfo::OperatingSystemArchitecture());
-
-  // CPU
-  base::CPU cpu;
-  metadata_dict->SetInteger("cpu-family", cpu.family());
-  metadata_dict->SetInteger("cpu-model", cpu.model());
-  metadata_dict->SetInteger("cpu-stepping", cpu.stepping());
-  metadata_dict->SetInteger("num-cpus", base::SysInfo::NumberOfProcessors());
-  metadata_dict->SetInteger("physical-memory",
-                            base::SysInfo::AmountOfPhysicalMemoryMB());
-
-  std::string cpu_brand = cpu.cpu_brand();
-  // Workaround for crbug.com/249713.
-  // TODO(oysteine): Remove workaround when bug is fixed.
-  size_t null_pos = cpu_brand.find('\0');
-  if (null_pos != std::string::npos)
-    cpu_brand.erase(null_pos);
-  metadata_dict->SetString("cpu-brand", cpu_brand);
-
-  // GPU
-  gpu::GPUInfo gpu_info = content::GpuDataManager::GetInstance()->GetGPUInfo();
-
-#if !defined(OS_ANDROID)
-  metadata_dict->SetInteger("gpu-venid", gpu_info.gpu.vendor_id);
-  metadata_dict->SetInteger("gpu-devid", gpu_info.gpu.device_id);
-#endif
-
-  metadata_dict->SetString("gpu-driver", gpu_info.driver_version);
-  metadata_dict->SetString("gpu-psver", gpu_info.pixel_shader_version);
-  metadata_dict->SetString("gpu-vsver", gpu_info.vertex_shader_version);
-
-#if defined(OS_MACOSX)
-  metadata_dict->SetString("gpu-glver", gpu_info.gl_version);
-#elif defined(OS_POSIX)
-  metadata_dict->SetString("gpu-gl-vendor", gpu_info.gl_vendor);
-  metadata_dict->SetString("gpu-gl-renderer", gpu_info.gl_renderer);
-#endif
-
-  if (delegate_)
-    delegate_->GenerateMetadataDict(metadata_dict.get());
-
-  return metadata_dict.Pass();
+  trace_data_sink->AddMetadata(metadata_dict);
 }
 
 void BackgroundTracingManagerImpl::BeginFinalizing(
@@ -557,12 +473,7 @@
             base::Bind(&BackgroundTracingManagerImpl::OnFinalizeStarted,
                        base::Unretained(this))));
     RecordBackgroundTracingMetric(FINALIZATION_ALLOWED);
-
-    if (auto metadata_dict = GenerateMetadataDict()) {
-      std::string results;
-      if (base::JSONWriter::Write(*metadata_dict.get(), &results))
-        trace_data_sink->SetMetadata(results);
-    }
+    AddCustomMetadata(trace_data_sink.get());
   } else {
     RecordBackgroundTracingMetric(FINALIZATION_DISALLOWED);
   }
diff --git a/content/browser/tracing/background_tracing_manager_impl.h b/content/browser/tracing/background_tracing_manager_impl.h
index 5652782..c46711c 100644
--- a/content/browser/tracing/background_tracing_manager_impl.h
+++ b/content/browser/tracing/background_tracing_manager_impl.h
@@ -54,12 +54,14 @@
 
   void EnableRecording(std::string, base::trace_event::TraceRecordMode);
   void EnableRecordingIfConfigNeedsIt();
-  void OnFinalizeStarted(base::RefCountedString*);
+  void OnFinalizeStarted(
+      scoped_ptr<const base::DictionaryValue> metadata,
+      base::RefCountedString*);
   void OnFinalizeComplete();
   void BeginFinalizing(StartedFinalizingCallback);
   void ValidateStartupScenario();
 
-  scoped_ptr<base::DictionaryValue> GenerateMetadataDict() const;
+  void AddCustomMetadata(TracingControllerImpl::TraceDataSink*) const;
 
   std::string GetTriggerNameFromHandle(TriggerHandle handle) const;
   bool IsTriggerHandleValid(TriggerHandle handle) const;
diff --git a/content/browser/tracing/tracing_controller_browsertest.cc b/content/browser/tracing/tracing_controller_browsertest.cc
index ca94e40..8cfa55b 100644
--- a/content/browser/tracing/tracing_controller_browsertest.cc
+++ b/content/browser/tracing/tracing_controller_browsertest.cc
@@ -22,7 +22,8 @@
     : public TracingController::TraceDataEndpoint {
  public:
   TracingControllerTestEndpoint(
-      base::Callback<void(base::RefCountedString*)> done_callback)
+      base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                          base::RefCountedString*)> done_callback)
       : done_callback_(done_callback) {}
 
   void ReceiveTraceChunk(const std::string& chunk) override {
@@ -30,7 +31,9 @@
     trace_ += chunk;
   }
 
-  void ReceiveTraceFinalContents(const std::string& contents) override {
+  void ReceiveTraceFinalContents(
+      scoped_ptr<const base::DictionaryValue> metadata,
+      const std::string& contents) override {
     EXPECT_EQ(trace_, contents);
 
     std::string tmp = contents;
@@ -39,14 +42,15 @@
 
     BrowserThread::PostTask(
         BrowserThread::UI, FROM_HERE,
-        base::Bind(done_callback_, chunk_ptr));
+        base::Bind(done_callback_, base::Passed(metadata.Pass()), chunk_ptr));
   }
 
  protected:
   ~TracingControllerTestEndpoint() override {}
 
   std::string trace_;
-  base::Callback<void(base::RefCountedString*)> done_callback_;
+  base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                      base::RefCountedString*)> done_callback_;
 };
 
 class TracingControllerTest : public ContentBrowserTest {
@@ -81,9 +85,12 @@
     quit_callback.Run();
   }
 
-  void DisableRecordingStringDoneCallbackTest(base::Closure quit_callback,
-                                              base::RefCountedString* data) {
+  void DisableRecordingStringDoneCallbackTest(
+      base::Closure quit_callback,
+      scoped_ptr<const base::DictionaryValue> metadata,
+      base::RefCountedString* data) {
     disable_recording_done_callback_count_++;
+    last_metadata_.reset(metadata.release());
     EXPECT_TRUE(data->size() > 0);
     quit_callback.Run();
   }
@@ -152,6 +159,10 @@
     return last_actual_monitoring_file_path_;
   }
 
+  const base::DictionaryValue* last_metadata() const {
+    return last_metadata_.get();
+  }
+
   void TestEnableAndDisableRecordingString() {
     Navigate(shell());
 
@@ -172,7 +183,8 @@
 
     {
       base::RunLoop run_loop;
-      base::Callback<void(base::RefCountedString*)> callback = base::Bind(
+      base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                          base::RefCountedString*)> callback = base::Bind(
           &TracingControllerTest::DisableRecordingStringDoneCallbackTest,
           base::Unretained(this),
           run_loop.QuitClosure());
@@ -202,7 +214,8 @@
 
     {
       base::RunLoop run_loop;
-      base::Callback<void(base::RefCountedString*)> callback = base::Bind(
+      base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                          base::RefCountedString*)> callback = base::Bind(
           &TracingControllerTest::DisableRecordingStringDoneCallbackTest,
           base::Unretained(this), run_loop.QuitClosure());
       bool result = controller->DisableRecording(
@@ -369,6 +382,7 @@
   int capture_monitoring_snapshot_done_callback_count_;
   base::FilePath last_actual_recording_file_path_;
   base::FilePath last_actual_monitoring_file_path_;
+  scoped_ptr<const base::DictionaryValue> last_metadata_;
 };
 
 IN_PROC_BROWSER_TEST_F(TracingControllerTest, GetCategories) {
@@ -390,6 +404,25 @@
   TestEnableAndDisableRecordingString();
 }
 
+IN_PROC_BROWSER_TEST_F(TracingControllerTest, DisableRecordingStoresMetadata) {
+  TestEnableAndDisableRecordingString();
+  // Check that a number of important keys exist in the metadata dictionary. The
+  // values are not checked to ensure the test is robust.
+  EXPECT_TRUE(last_metadata() != NULL);
+  std::string network_type;
+  last_metadata()->GetString("network-type", &network_type);
+  EXPECT_TRUE(network_type.length() > 0);
+  std::string user_agent;
+  last_metadata()->GetString("user-agent", &user_agent);
+  EXPECT_TRUE(user_agent.length() > 0);
+  std::string os_name;
+  last_metadata()->GetString("os-name", &os_name);
+  EXPECT_TRUE(os_name.length() > 0);
+  std::string cpu_brand;
+  last_metadata()->GetString("cpu-brand", &cpu_brand);
+  EXPECT_TRUE(cpu_brand.length() > 0);
+}
+
 IN_PROC_BROWSER_TEST_F(TracingControllerTest,
                        EnableAndDisableRecordingWithFilePath) {
   base::FilePath file_path;
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc
index 0734757..dcd93c5 100644
--- a/content/browser/tracing/tracing_controller_impl.cc
+++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -4,10 +4,12 @@
 #include "content/browser/tracing/tracing_controller_impl.h"
 
 #include "base/bind.h"
+#include "base/cpu.h"
 #include "base/files/file_util.h"
 #include "base/json/string_escape.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/sys_info.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/tracing/file_tracing_provider_impl.h"
 #include "content/browser/tracing/power_tracing_agent.h"
@@ -15,8 +17,14 @@
 #include "content/browser/tracing/tracing_ui.h"
 #include "content/common/child_process_messages.h"
 #include "content/public/browser/browser_message_filter.h"
+#include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/gpu_data_manager.h"
+#include "content/public/browser/tracing_delegate.h"
 #include "content/public/common/child_process_host.h"
+#include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
+#include "gpu/config/gpu_info.h"
+#include "net/base/network_change_notifier.h"
 
 #if defined(OS_CHROMEOS)
 #include "chromeos/dbus/dbus_thread_manager.h"
@@ -37,6 +45,88 @@
 base::LazyInstance<TracingControllerImpl>::Leaky g_controller =
     LAZY_INSTANCE_INITIALIZER;
 
+
+std::string GetNetworkTypeString() {
+  switch (net::NetworkChangeNotifier::GetConnectionType()) {
+    case net::NetworkChangeNotifier::CONNECTION_ETHERNET:
+      return "Ethernet";
+    case net::NetworkChangeNotifier::CONNECTION_WIFI:
+      return "WiFi";
+    case net::NetworkChangeNotifier::CONNECTION_2G:
+      return "2G";
+    case net::NetworkChangeNotifier::CONNECTION_3G:
+      return "3G";
+    case net::NetworkChangeNotifier::CONNECTION_4G:
+      return "4G";
+    case net::NetworkChangeNotifier::CONNECTION_NONE:
+      return "None";
+    case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH:
+      return "Bluetooth";
+    case net::NetworkChangeNotifier::CONNECTION_UNKNOWN:
+    default:
+      break;
+  }
+  return "Unknown";
+}
+
+scoped_ptr<base::DictionaryValue> GenerateTracingMetadataDict()  {
+  scoped_ptr<base::DictionaryValue> metadata_dict(new base::DictionaryValue());
+
+  metadata_dict->SetString("network-type", GetNetworkTypeString());
+  metadata_dict->SetString("product-version", GetContentClient()->GetProduct());
+  metadata_dict->SetString("user-agent", GetContentClient()->GetUserAgent());
+
+  // OS
+  metadata_dict->SetString("os-name", base::SysInfo::OperatingSystemName());
+  metadata_dict->SetString("os-version",
+                           base::SysInfo::OperatingSystemVersion());
+  metadata_dict->SetString("os-arch",
+                           base::SysInfo::OperatingSystemArchitecture());
+
+  // CPU
+  base::CPU cpu;
+  metadata_dict->SetInteger("cpu-family", cpu.family());
+  metadata_dict->SetInteger("cpu-model", cpu.model());
+  metadata_dict->SetInteger("cpu-stepping", cpu.stepping());
+  metadata_dict->SetInteger("num-cpus", base::SysInfo::NumberOfProcessors());
+  metadata_dict->SetInteger("physical-memory",
+                            base::SysInfo::AmountOfPhysicalMemoryMB());
+
+  std::string cpu_brand = cpu.cpu_brand();
+  // Workaround for crbug.com/249713.
+  // TODO(oysteine): Remove workaround when bug is fixed.
+  size_t null_pos = cpu_brand.find('\0');
+  if (null_pos != std::string::npos)
+    cpu_brand.erase(null_pos);
+  metadata_dict->SetString("cpu-brand", cpu_brand);
+
+  // GPU
+  gpu::GPUInfo gpu_info = content::GpuDataManager::GetInstance()->GetGPUInfo();
+
+#if !defined(OS_ANDROID)
+  metadata_dict->SetInteger("gpu-venid", gpu_info.gpu.vendor_id);
+  metadata_dict->SetInteger("gpu-devid", gpu_info.gpu.device_id);
+#endif
+
+  metadata_dict->SetString("gpu-driver", gpu_info.driver_version);
+  metadata_dict->SetString("gpu-psver", gpu_info.pixel_shader_version);
+  metadata_dict->SetString("gpu-vsver", gpu_info.vertex_shader_version);
+
+#if defined(OS_MACOSX)
+  metadata_dict->SetString("gpu-glver", gpu_info.gl_version);
+#elif defined(OS_POSIX)
+  metadata_dict->SetString("gpu-gl-vendor", gpu_info.gl_vendor);
+  metadata_dict->SetString("gpu-gl-renderer", gpu_info.gl_renderer);
+#endif
+
+  scoped_ptr<TracingDelegate> delegate(
+      GetContentClient()->browser()->GetTracingDelegate());
+  if (delegate)
+    delegate->GenerateMetadataDict(metadata_dict.get());
+
+  return metadata_dict.Pass();
+}
+
 }  // namespace
 
 TracingController* TracingController::GetInstance() {
@@ -186,6 +276,9 @@
     const scoped_refptr<TraceDataSink>& trace_data_sink) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
+  if (trace_data_sink)
+    trace_data_sink->AddMetadata(*GenerateTracingMetadataDict().get());
+
   if (!can_disable_recording())
     return false;
 
diff --git a/content/browser/tracing/tracing_controller_impl_data_sinks.cc b/content/browser/tracing/tracing_controller_impl_data_sinks.cc
index 38fdfbcd..0f67ac3 100644
--- a/content/browser/tracing/tracing_controller_impl_data_sinks.cc
+++ b/content/browser/tracing/tracing_controller_impl_data_sinks.cc
@@ -5,6 +5,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
+#include "base/json/json_writer.h"
 #include "content/public/browser/browser_thread.h"
 #include "third_party/zlib/zlib.h"
 
@@ -14,18 +15,22 @@
 
 class StringTraceDataEndpoint : public TracingController::TraceDataEndpoint {
  public:
-  typedef base::Callback<void(base::RefCountedString*)> CompletionCallback;
+  typedef base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                              base::RefCountedString*)> CompletionCallback;
 
   explicit StringTraceDataEndpoint(CompletionCallback callback)
       : completion_callback_(callback) {}
 
-  void ReceiveTraceFinalContents(const std::string& contents) override {
+  void ReceiveTraceFinalContents(
+      scoped_ptr<const base::DictionaryValue> metadata,
+      const std::string& contents) override {
     std::string tmp = contents;
     scoped_refptr<base::RefCountedString> str =
         base::RefCountedString::TakeString(&tmp);
 
     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                            base::Bind(completion_callback_, str));
+                            base::Bind(completion_callback_,
+                                       base::Passed(metadata.Pass()), str));
   }
 
  private:
@@ -54,7 +59,9 @@
                    chunk_ptr));
   }
 
-  void ReceiveTraceFinalContents(const std::string& contents) override {
+  void ReceiveTraceFinalContents(
+      scoped_ptr<const base::DictionaryValue> ,
+      const std::string& contents) override {
     BrowserThread::PostTask(
         BrowserThread::FILE, FROM_HERE,
         base::Bind(&FileTraceDataEndpoint::CloseOnFileThread, this));
@@ -128,10 +135,6 @@
     system_trace_ = data;
   }
 
-  void SetMetadata(const std::string& data) override {
-    metadata_ = data;
-  }
-
   void SetPowerTrace(const std::string& data) override { power_trace_ = data; }
 
   void Close() override {
@@ -139,8 +142,10 @@
     if (!system_trace_.empty())
       AddTraceChunkAndPassToEndpoint(",\"systemTraceEvents\": " +
                                      system_trace_);
-    if (!metadata_.empty())
-      AddTraceChunkAndPassToEndpoint(",\"metadata\": " + metadata_);
+    std::string metadataJSON;
+    if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) &&
+        !metadataJSON.empty())
+      AddTraceChunkAndPassToEndpoint(",\"metadata\": " + metadataJSON);
     if (!power_trace_.empty()) {
       AddTraceChunkAndPassToEndpoint(",\"powerTraceAsString\": " +
                                      power_trace_);
@@ -148,7 +153,8 @@
 
     AddTraceChunkAndPassToEndpoint("}");
 
-    endpoint_->ReceiveTraceFinalContents(trace_);
+    scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy());
+    endpoint_->ReceiveTraceFinalContents(metadata.Pass(), trace_);
   }
 
  private:
@@ -157,7 +163,6 @@
   scoped_refptr<TracingController::TraceDataEndpoint> endpoint_;
   std::string trace_;
   std::string system_trace_;
-  std::string metadata_;
   std::string power_trace_;
 
   DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink);
@@ -183,10 +188,6 @@
     system_trace_ = data;
   }
 
-  void SetMetadata(const std::string& data) override {
-    metadata_ = data;
-  }
-
   void SetPowerTrace(const std::string& data) override { power_trace_ = data; }
 
   void Close() override {
@@ -276,8 +277,10 @@
       AddTraceChunkAndCompressOnFileThread(
           ",\"systemTraceEvents\": " + system_trace_, false);
     }
-    if (!metadata_.empty()) {
-      AddTraceChunkAndCompressOnFileThread(",\"metadata\": " + metadata_,
+    std::string metadataJSON;
+    if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) &&
+        !metadataJSON.empty()) {
+      AddTraceChunkAndCompressOnFileThread(",\"metadata\": " + metadataJSON,
                                            false);
     }
     if (!power_trace_.empty()) {
@@ -289,7 +292,9 @@
     deflateEnd(stream_.get());
     stream_.reset();
 
-    endpoint_->ReceiveTraceFinalContents(compressed_trace_data_);
+    scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy());
+    endpoint_->ReceiveTraceFinalContents(metadata.Pass(),
+                                         compressed_trace_data_);
   }
 
   scoped_refptr<TracingController::TraceDataEndpoint> endpoint_;
@@ -297,7 +302,6 @@
   bool already_tried_open_;
   std::string compressed_trace_data_;
   std::string system_trace_;
-  std::string metadata_;
   std::string power_trace_;
 
   DISALLOW_COPY_AND_ASSIGN(CompressedStringTraceDataSink);
@@ -305,9 +309,20 @@
 
 }  // namespace
 
+void TracingController::TraceDataSink::AddMetadata(
+    const base::DictionaryValue& data) {
+  metadata_.MergeDictionary(&data);
+}
+
+const base::DictionaryValue&
+    TracingController::TraceDataSink::GetMetadata() const {
+  return metadata_;
+}
+
 scoped_refptr<TracingController::TraceDataSink>
 TracingController::CreateStringSink(
-    const base::Callback<void(base::RefCountedString*)>& callback) {
+    const base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                              base::RefCountedString*)>& callback) {
   return new StringTraceDataSink(new StringTraceDataEndpoint(callback));
 }
 
@@ -325,8 +340,9 @@
 }
 
 scoped_refptr<TracingController::TraceDataEndpoint>
-TracingController::CreateCallbackEndpoint(
-    const base::Callback<void(base::RefCountedString*)>& callback) {
+TracingController::CreateCallbackEndpoint(const base::Callback<
+    void(scoped_ptr<const base::DictionaryValue>,
+         base::RefCountedString*)>& callback) {
   return new StringTraceDataEndpoint(callback);
 }
 
diff --git a/content/browser/tracing/tracing_ui.cc b/content/browser/tracing/tracing_ui.cc
index 4829c36..e8e75b5 100644
--- a/content/browser/tracing/tracing_ui.cc
+++ b/content/browser/tracing/tracing_ui.cc
@@ -194,24 +194,19 @@
 
 void TracingCallbackWrapperBase64(
     const WebUIDataSource::GotDataCallback& callback,
+    scoped_ptr<const base::DictionaryValue> metadata,
     base::RefCountedString* data) {
   base::RefCountedString* data_base64 = new base::RefCountedString();
   base::Base64Encode(data->data(), &data_base64->data());
   callback.Run(data_base64);
 }
 
-std::string GenerateMetadataJSON() {
-  // Serialize metadata to json.
-  scoped_ptr<base::DictionaryValue> metadata_dict(new base::DictionaryValue());
-  metadata_dict->SetString("version", GetContentClient()->GetProduct());
-  metadata_dict->SetString(
+void AddCustomMetadata(TracingControllerImpl::TraceDataSink* trace_data_sink) {
+  base::DictionaryValue metadata_dict;
+  metadata_dict.SetString(
       "command_line",
       base::CommandLine::ForCurrentProcess()->GetCommandLineString());
-
-  std::string results;
-  if (base::JSONWriter::Write(*metadata_dict.get(), &results))
-    return results;
-  return std::string();
+  trace_data_sink->AddMetadata(metadata_dict);
 }
 
 bool OnBeginJSONRequest(const std::string& path,
@@ -240,7 +235,7 @@
         TracingController::CreateCompressedStringSink(
             TracingController::CreateCallbackEndpoint(
                 base::Bind(TracingCallbackWrapperBase64, callback)));
-    data_sink->SetMetadata(GenerateMetadataJSON());
+    AddCustomMetadata(data_sink.get());
     return TracingController::GetInstance()->DisableRecording(data_sink);
   }
 
@@ -258,7 +253,7 @@
         TracingController::CreateCompressedStringSink(
             TracingController::CreateCallbackEndpoint(
                 base::Bind(TracingCallbackWrapperBase64, callback)));
-    data_sink->SetMetadata(GenerateMetadataJSON());
+    AddCustomMetadata(data_sink.get());
     TracingController::GetInstance()->CaptureMonitoringSnapshot(data_sink);
     return true;
   }
diff --git a/content/browser/utility_process_host_impl.cc b/content/browser/utility_process_host_impl.cc
index 2fdd365..e087f11 100644
--- a/content/browser/utility_process_host_impl.cc
+++ b/content/browser/utility_process_host_impl.cc
@@ -230,26 +230,36 @@
   } else {
     const base::CommandLine& browser_command_line =
         *base::CommandLine::ForCurrentProcess();
-    int child_flags = child_flags_;
 
     bool has_cmd_prefix = browser_command_line.HasSwitch(
         switches::kUtilityCmdPrefix);
 
-    // When running under gdb, forking /proc/self/exe ends up forking the gdb
-    // executable instead of Chromium. It is almost safe to assume that no
-    // updates will happen while a developer is running with
-    // |switches::kUtilityCmdPrefix|. See ChildProcessHost::GetChildPath() for
-    // a similar case with Valgrind.
-    if (has_cmd_prefix)
-      child_flags = ChildProcessHost::CHILD_NORMAL;
+    #if defined(OS_ANDROID)
+      // readlink("/prof/self/exe") sometimes fails on Android at startup.
+      // As a workaround skip calling it here, since the executable name is
+      // not needed on Android anyway. See crbug.com/500854.
+      base::CommandLine* cmd_line =
+          new base::CommandLine(base::CommandLine::NO_PROGRAM);
+    #else
+      int child_flags = child_flags_;
 
-    base::FilePath exe_path = ChildProcessHost::GetChildPath(child_flags);
-    if (exe_path.empty()) {
-      NOTREACHED() << "Unable to get utility process binary name.";
-      return false;
-    }
+      // When running under gdb, forking /proc/self/exe ends up forking the gdb
+      // executable instead of Chromium. It is almost safe to assume that no
+      // updates will happen while a developer is running with
+      // |switches::kUtilityCmdPrefix|. See ChildProcessHost::GetChildPath() for
+      // a similar case with Valgrind.
+      if (has_cmd_prefix)
+        child_flags = ChildProcessHost::CHILD_NORMAL;
 
-    base::CommandLine* cmd_line = new base::CommandLine(exe_path);
+      base::FilePath exe_path = ChildProcessHost::GetChildPath(child_flags);
+      if (exe_path.empty()) {
+        NOTREACHED() << "Unable to get utility process binary name.";
+        return false;
+      }
+
+      base::CommandLine* cmd_line = new base::CommandLine(exe_path);
+    #endif
+
     cmd_line->AppendSwitchASCII(switches::kProcessType,
                                 switches::kUtilityProcess);
     cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id);
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 27a226f..ece7e1b 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -402,6 +402,7 @@
           BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()),
       audio_stream_monitor_(this),
       virtual_keyboard_requested_(false),
+      page_scale_factor_is_one_(true),
       loading_weak_factory_(this) {
   frame_tree_.SetFrameRemoveListener(
       base::Bind(&WebContentsImpl::OnFrameRemoved,
@@ -625,6 +626,8 @@
                         OnDidRunInsecureContent)
     IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset)
     IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_PageScaleFactorChanged,
+                        OnPageScaleFactorChanged)
     IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory)
     IPC_MESSAGE_HANDLER(FrameHostMsg_RegisterProtocolHandler,
                         OnRegisterProtocolHandler)
@@ -1177,8 +1180,10 @@
   // The resize rect might have changed while this was inactive -- send the new
   // one to make sure it's up to date.
   RenderViewHostImpl* rvh = GetRenderViewHost();
-  if (rvh)
-    rvh->GetWidget()->ResizeRectChanged(GetRootWindowResizerRect());
+  if (rvh) {
+    rvh->GetWidget()->ResizeRectChanged(
+        GetRootWindowResizerRect(rvh->GetWidget()));
+  }
 
   // Restore power save blocker if there are active video players running.
   if (!active_video_players_.empty() && !video_power_save_blocker_)
@@ -1656,13 +1661,19 @@
                    : blink::WebDisplayModeBrowser;
 }
 
-void WebContentsImpl::RequestToLockMouse(bool user_gesture,
-                                         bool last_unlocked_by_target) {
-  if (delegate_) {
-    delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target);
-  } else {
-    GotResponseToLockMouseRequest(false);
+void WebContentsImpl::RequestToLockMouse(
+    RenderWidgetHostImpl* render_widget_host,
+    bool user_gesture,
+    bool last_unlocked_by_target) {
+  if (render_widget_host != GetRenderViewHost()->GetWidget()) {
+    render_widget_host->GotResponseToLockMouseRequest(false);
+    return;
   }
+
+  if (delegate_)
+    delegate_->RequestToLockMouse(this, user_gesture, last_unlocked_by_target);
+  else
+    GotResponseToLockMouseRequest(false);
 }
 
 void WebContentsImpl::LostMouseLock() {
@@ -2160,7 +2171,12 @@
   OnPreferredSizeChanged(old_size);
 }
 
-void WebContentsImpl::ResizeDueToAutoResize(const gfx::Size& new_size) {
+void WebContentsImpl::ResizeDueToAutoResize(
+    RenderWidgetHostImpl* render_widget_host,
+    const gfx::Size& new_size) {
+  if (render_widget_host != GetRenderViewHost()->GetWidget())
+    return;
+
   if (delegate_)
     delegate_->ResizeDueToAutoResize(this, new_size);
 }
@@ -2605,7 +2621,7 @@
 }
 
 void WebContentsImpl::UserGestureDone() {
-  OnUserGesture();
+  OnUserGesture(GetRenderViewHost()->GetWidget());
 }
 
 void WebContentsImpl::SetClosedByUserGesture(bool value) {
@@ -2643,8 +2659,8 @@
   return maximum_zoom_percent_;
 }
 
-void WebContentsImpl::ResetPageScale() {
-  Send(new ViewMsg_ResetPageScale(GetRoutingID()));
+void WebContentsImpl::SetPageScale(float page_scale_factor) {
+  Send(new ViewMsg_SetPageScale(GetRoutingID(), page_scale_factor));
 }
 
 gfx::Size WebContentsImpl::GetPreferredSize() const {
@@ -3142,6 +3158,26 @@
   maximum_zoom_percent_ = maximum_percent;
 }
 
+void WebContentsImpl::OnPageScaleFactorChanged(float page_scale_factor) {
+  bool is_one = page_scale_factor == 1.f;
+  if (is_one != page_scale_factor_is_one_) {
+    page_scale_factor_is_one_ = is_one;
+
+    HostZoomMapImpl* host_zoom_map =
+        static_cast<HostZoomMapImpl*>(HostZoomMap::GetForWebContents(this));
+
+    if (host_zoom_map && GetRenderProcessHost()) {
+      host_zoom_map->SetPageScaleFactorIsOneForView(
+          GetRenderProcessHost()->GetID(), GetRoutingID(),
+          page_scale_factor_is_one_);
+    }
+  }
+
+  FOR_EACH_OBSERVER(WebContentsObserver,
+                    observers_,
+                    OnPageScaleFactorChanged(page_scale_factor));
+}
+
 void WebContentsImpl::OnEnumerateDirectory(int request_id,
                                            const base::FilePath& path) {
   if (!delegate_)
@@ -3767,7 +3803,11 @@
   return renderer_preferences_;
 }
 
-gfx::Rect WebContentsImpl::GetRootWindowResizerRect() const {
+gfx::Rect WebContentsImpl::GetRootWindowResizerRect(
+    RenderWidgetHostImpl* render_widget_host) const {
+  if (!RenderViewHostImpl::From(render_widget_host))
+    return gfx::Rect();
+
   if (delegate_)
     return delegate_->GetRootWindowResizerRect();
   return gfx::Rect();
@@ -4219,7 +4259,10 @@
   return render_view_routing_id;
 }
 
-void WebContentsImpl::OnUserGesture() {
+void WebContentsImpl::OnUserGesture(RenderWidgetHostImpl* render_widget_host) {
+  if (render_widget_host != GetRenderViewHost()->GetWidget())
+    return;
+
   // Notify observers.
   FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture());
 
@@ -4238,14 +4281,14 @@
   FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetIgnoredUIEvent());
 }
 
-void WebContentsImpl::RendererUnresponsive(RenderViewHost* render_view_host) {
+void WebContentsImpl::RendererUnresponsive(
+    RenderWidgetHostImpl* render_widget_host) {
   // Don't show hung renderer dialog for a swapped out RVH.
-  if (render_view_host != GetRenderViewHost())
+  if (render_widget_host != GetRenderViewHost()->GetWidget())
     return;
 
-  RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(render_view_host);
   RenderFrameHostImpl* rfhi =
-      static_cast<RenderFrameHostImpl*>(rvhi->GetMainFrame());
+      static_cast<RenderFrameHostImpl*>(GetRenderViewHost()->GetMainFrame());
 
   // Ignore renderer unresponsive event if debugger is attached to the tab
   // since the event may be a result of the renderer sitting on a breakpoint.
@@ -4257,7 +4300,7 @@
       rfhi->IsWaitingForUnloadACK()) {
     // Hang occurred while firing the beforeunload/unload handler.
     // Pretend the handler fired so tab closing continues as if it had.
-    rvhi->set_sudden_termination_allowed(true);
+    GetRenderViewHost()->set_sudden_termination_allowed(true);
 
     if (!GetRenderManager()->ShouldCloseTabOnUnresponsiveRenderer())
       return;
@@ -4273,7 +4316,7 @@
       delegate_->BeforeUnloadFired(this, true, &close);
     }
     if (close)
-      Close(rvhi);
+      Close();
     return;
   }
 
@@ -4284,7 +4327,11 @@
     delegate_->RendererUnresponsive(this);
 }
 
-void WebContentsImpl::RendererResponsive(RenderViewHost* render_view_host) {
+void WebContentsImpl::RendererResponsive(
+    RenderWidgetHostImpl* render_widget_host) {
+  if (render_widget_host != GetRenderViewHost()->GetWidget())
+    return;
+
   if (delegate_)
     delegate_->RendererResponsive(this);
 }
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 5755f31..5a520a8 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -350,7 +350,7 @@
   void ViewFrameSource(const GURL& url, const PageState& page_state) override;
   int GetMinimumZoomPercent() const override;
   int GetMaximumZoomPercent() const override;
-  void ResetPageScale() override;
+  void SetPageScale(float page_scale_factor) override;
   gfx::Size GetPreferredSize() const override;
   bool GotResponseToLockMouseRequest(bool allowed) override;
   bool HasOpener() const override;
@@ -451,7 +451,6 @@
   // RenderFrameHostDelegate has the same method, so list it there because this
   // interface is going away.
   // WebContents* GetAsWebContents() override;
-  gfx::Rect GetRootWindowResizerRect() const override;
   void RenderViewCreated(RenderViewHost* render_view_host) override;
   void RenderViewReady(RenderViewHost* render_view_host) override;
   void RenderViewTerminated(RenderViewHost* render_view_host,
@@ -474,11 +473,8 @@
                            const base::string16& source_id) override;
   RendererPreferences GetRendererPrefs(
       BrowserContext* browser_context) const override;
-  void OnUserGesture() override;
   void OnUserInteraction(const blink::WebInputEvent::Type type) override;
   void OnIgnoredUIEvent() override;
-  void RendererUnresponsive(RenderViewHost* render_view_host) override;
-  void RendererResponsive(RenderViewHost* render_view_host) override;
   void LoadStateChanged(const GURL& url,
                         const net::LoadStateWithParam& load_state,
                         uint64 upload_position,
@@ -490,9 +486,6 @@
   bool IsFullscreenForCurrentTab() const override;
   blink::WebDisplayMode GetDisplayMode() const override;
   void UpdatePreferredSize(const gfx::Size& pref_size) override;
-  void ResizeDueToAutoResize(const gfx::Size& new_size) override;
-  void RequestToLockMouse(bool user_gesture,
-                          bool last_unlocked_by_target) override;
   void LostMouseLock() override;
   void CreateNewWindow(
       SiteInstance* source_site_instance,
@@ -575,11 +568,14 @@
   void RenderWidgetGotFocus(RenderWidgetHostImpl* render_widget_host) override;
   void RenderWidgetWasResized(RenderWidgetHostImpl* render_widget_host,
                               bool width_changed) override;
+  void ResizeDueToAutoResize(RenderWidgetHostImpl* render_widget_host,
+                             const gfx::Size& new_size) override;
   void ScreenInfoChanged() override;
   bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
                               bool* is_keyboard_shortcut) override;
   void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) override;
   bool HandleWheelEvent(const blink::WebMouseWheelEvent& event) override;
+  void OnUserGesture(RenderWidgetHostImpl* render_widget_host) override;
   bool PreHandleGestureEvent(const blink::WebGestureEvent& event) override;
   void DidSendScreenRects(RenderWidgetHostImpl* rwh) override;
   BrowserAccessibilityManager* GetRootBrowserAccessibilityManager() override;
@@ -597,6 +593,13 @@
   RenderWidgetHostInputEventRouter* GetInputEventRouter() override;
   void ReplicatePageFocus(bool is_focused) override;
   RenderWidgetHostImpl* GetFocusedRenderWidgetHost() override;
+  void RendererUnresponsive(RenderWidgetHostImpl* render_widget_host) override;
+  void RendererResponsive(RenderWidgetHostImpl* render_widget_host) override;
+  void RequestToLockMouse(RenderWidgetHostImpl* render_widget_host,
+                          bool user_gesture,
+                          bool last_unlocked_by_target) override;
+  gfx::Rect GetRootWindowResizerRect(
+      RenderWidgetHostImpl* render_widget_host) const override;
 
   // RenderFrameHostManager::Delegate ------------------------------------------
 
@@ -839,6 +842,7 @@
   void OnGoToEntryAtOffset(int offset);
   void OnUpdateZoomLimits(int minimum_percent,
                           int maximum_percent);
+  void OnPageScaleFactorChanged(float page_scale_factor);
   void OnEnumerateDirectory(int request_id, const base::FilePath& path);
 
   void OnRegisterProtocolHandler(const std::string& protocol,
@@ -1321,6 +1325,8 @@
 
   PageImportanceSignals page_importance_signals_;
 
+  bool page_scale_factor_is_one_;
+
   base::WeakPtrFactory<WebContentsImpl> loading_weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(WebContentsImpl);
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 7a05171..20cdcca8 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -27,6 +27,7 @@
 #include "content/shell/browser/shell.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "testing/gmock/include/gmock/gmock.h"
 
 namespace content {
 
@@ -713,6 +714,60 @@
   EXPECT_EQ(base::ASCIIToUTF16("true"), shell()->web_contents()->GetTitle());
 }
 
+// Observer class used to verify that WebContentsObservers are notified
+// when the page scale factor changes.
+// See WebContentsImplBrowserTest.ChangePageScale.
+class MockPageScaleObserver : public WebContentsObserver {
+ public:
+  MockPageScaleObserver(Shell* shell)
+      : WebContentsObserver(shell->web_contents()),
+        got_page_scale_update_(false) {
+    // Once OnPageScaleFactorChanged is called, quit the run loop.
+    ON_CALL(*this, OnPageScaleFactorChanged(::testing::_)).WillByDefault(
+        ::testing::InvokeWithoutArgs(
+            this, &MockPageScaleObserver::GotPageScaleUpdate));
+  }
+
+  MOCK_METHOD1(OnPageScaleFactorChanged, void(float page_scale_factor));
+
+  void WaitForPageScaleUpdate() {
+    if (!got_page_scale_update_) {
+      base::RunLoop run_loop;
+      on_page_scale_update_ = run_loop.QuitClosure();
+      run_loop.Run();
+    }
+    got_page_scale_update_ = false;
+  }
+
+ private:
+  void GotPageScaleUpdate() {
+    got_page_scale_update_ = true;
+    on_page_scale_update_.Run();
+  }
+
+  base::Closure on_page_scale_update_;
+  bool got_page_scale_update_;
+};
+
+// When the page scale factor is set in the renderer it should send
+// a notification to the browser so that WebContentsObservers are notified.
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, ChangePageScale) {
+  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+  NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html"));
+
+  MockPageScaleObserver observer(shell());
+  ::testing::InSequence expect_call_sequence;
+
+  shell()->web_contents()->SetPageScale(1.5);
+  EXPECT_CALL(observer, OnPageScaleFactorChanged(::testing::FloatEq(1.5)));
+  observer.WaitForPageScaleUpdate();
+
+  // Navigate to reset the page scale factor.
+  shell()->LoadURL(embedded_test_server()->GetURL("/title2.html"));
+  EXPECT_CALL(observer, OnPageScaleFactorChanged(::testing::_));
+  observer.WaitForPageScaleUpdate();
+}
+
 IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, NewNamedWindow) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc
index 485aff6..44302df1 100644
--- a/content/browser/webui/url_data_manager_backend.cc
+++ b/content/browser/webui/url_data_manager_backend.cc
@@ -119,7 +119,7 @@
   // net::URLRequestJob implementation.
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetMimeType(std::string* mime_type) const override;
   int GetResponseCode() const override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
@@ -190,9 +190,8 @@
   bool RequiresUnsafeEval() const;
 
   // Do the actual copy from data_ (the data we're serving) into |buf|.
-  // Separate from ReadRawData so we can handle async I/O. Returns the number of
-  // bytes read.
-  int CompleteRead(net::IOBuffer* buf, int buf_size);
+  // Separate from ReadRawData so we can handle async I/O.
+  void CompleteRead(net::IOBuffer* buf, int buf_size, int* bytes_read);
 
   // The actual data we're serving.  NULL until it's been fetched.
   scoped_refptr<base::RefCountedMemory> data_;
@@ -337,16 +336,22 @@
 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) {
   TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this);
   if (bytes) {
+    // The request completed, and we have all the data.
+    // Clear any IO pending status.
+    SetStatus(net::URLRequestStatus());
+
     data_ = bytes;
+    int bytes_read;
     if (pending_buf_.get()) {
       CHECK(pending_buf_->data());
-      int result = CompleteRead(pending_buf_.get(), pending_buf_size_);
+      CompleteRead(pending_buf_.get(), pending_buf_size_, &bytes_read);
       pending_buf_ = NULL;
-      ReadRawDataComplete(result);
+      NotifyReadComplete(bytes_read);
     }
   } else {
     // The request failed.
-    ReadRawDataComplete(net::ERR_FAILED);
+    NotifyDone(
+        net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
   }
 }
 
@@ -354,21 +359,27 @@
   return weak_factory_.GetWeakPtr();
 }
 
-int URLRequestChromeJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
+bool URLRequestChromeJob::ReadRawData(net::IOBuffer* buf,
+                                      int buf_size,
+                                      int* bytes_read) {
   if (!data_.get()) {
+    SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
     DCHECK(!pending_buf_.get());
     CHECK(buf->data());
     pending_buf_ = buf;
     pending_buf_size_ = buf_size;
-    return net::ERR_IO_PENDING;
+    return false;  // Tell the caller we're still waiting for data.
   }
 
   // Otherwise, the data is available.
-  return CompleteRead(buf, buf_size);
+  CompleteRead(buf, buf_size, bytes_read);
+  return true;
 }
 
-int URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size) {
-  int remaining = data_->size() - data_offset_;
+void URLRequestChromeJob::CompleteRead(net::IOBuffer* buf,
+                                       int buf_size,
+                                       int* bytes_read) {
+  int remaining = static_cast<int>(data_->size()) - data_offset_;
   if (buf_size > remaining)
     buf_size = remaining;
   if (buf_size > 0) {
@@ -380,7 +391,7 @@
     memcpy(buf->data(), data_->front() + data_offset_, buf_size);
     data_offset_ += buf_size;
   }
-  return buf_size;
+  *bytes_read = buf_size;
 }
 
 void URLRequestChromeJob::CheckStoragePartitionMatches(
diff --git a/content/child/background_sync/background_sync_type_converters.cc b/content/child/background_sync/background_sync_type_converters.cc
index 8591ad3..e26c2e3 100644
--- a/content/child/background_sync/background_sync_type_converters.cc
+++ b/content/child/background_sync/background_sync_type_converters.cc
@@ -8,37 +8,42 @@
 
 namespace mojo {
 
-#define COMPILE_ASSERT_MATCHING_ENUM(mojo_name, blink_name)     \
-  COMPILE_ASSERT(static_cast<int>(content::mojo_name) ==        \
-      static_cast<int>(blink::WebSyncRegistration::blink_name), \
-      mismatching_enums)
+#define COMPILE_ASSERT_MATCHING_ENUM(mojo_name, blink_name) \
+  COMPILE_ASSERT(static_cast<int>(content::mojo_name) ==    \
+                     static_cast<int>(blink::blink_name),   \
+                 mismatching_enums)
 
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_PERIODICITY_PERIODIC,
-                             PeriodicityPeriodic);
+                             WebSyncRegistration::PeriodicityPeriodic);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_PERIODICITY_ONE_SHOT,
-                             PeriodicityOneShot);
+                             WebSyncRegistration::PeriodicityOneShot);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_PERIODICITY_MAX,
-                             PeriodicityOneShot);
+                             WebSyncRegistration::PeriodicityOneShot);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_PERIODICITY_MAX,
-                             PeriodicityLast);
+                             WebSyncRegistration::PeriodicityLast);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_NETWORK_STATE_ANY,
-                             NetworkStateAny);
+                             WebSyncRegistration::NetworkStateAny);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_NETWORK_STATE_AVOID_CELLULAR,
-                             NetworkStateAvoidCellular);
+                             WebSyncRegistration::NetworkStateAvoidCellular);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_NETWORK_STATE_ONLINE,
-                             NetworkStateOnline);
+                             WebSyncRegistration::NetworkStateOnline);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_NETWORK_STATE_MAX,
-                             NetworkStateOnline);
+                             WebSyncRegistration::NetworkStateOnline);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_NETWORK_STATE_MAX,
-                             NetworkStateLast);
+                             WebSyncRegistration::NetworkStateLast);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_POWER_STATE_AUTO,
-                             PowerStateAuto);
+                             WebSyncRegistration::PowerStateAuto);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_POWER_STATE_AVOID_DRAINING,
-                             PowerStateAvoidDraining);
+                             WebSyncRegistration::PowerStateAvoidDraining);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_POWER_STATE_MAX,
-                             PowerStateAvoidDraining);
+                             WebSyncRegistration::PowerStateAvoidDraining);
 COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_POWER_STATE_MAX,
-                             PowerStateLast);
+                             WebSyncRegistration::PowerStateLast);
+COMPILE_ASSERT_MATCHING_ENUM(
+    BACKGROUND_SYNC_EVENT_LAST_CHANCE_IS_NOT_LAST_CHANCE,
+    WebServiceWorkerContextProxy::IsNotLastChance);
+COMPILE_ASSERT_MATCHING_ENUM(BACKGROUND_SYNC_EVENT_LAST_CHANCE_IS_LAST_CHANCE,
+                             WebServiceWorkerContextProxy::IsLastChance);
 
 // static
 blink::WebSyncRegistration::Periodicity
@@ -126,4 +131,21 @@
   return result.Pass();
 }
 
+// static
+blink::WebServiceWorkerContextProxy::LastChanceOption
+TypeConverter<blink::WebServiceWorkerContextProxy::LastChanceOption,
+              content::BackgroundSyncEventLastChance>::
+    Convert(content::BackgroundSyncEventLastChance input) {
+  return static_cast<blink::WebServiceWorkerContextProxy::LastChanceOption>(
+      input);
+}
+
+// static
+content::BackgroundSyncEventLastChance
+TypeConverter<content::BackgroundSyncEventLastChance,
+              blink::WebServiceWorkerContextProxy::LastChanceOption>::
+    Convert(blink::WebServiceWorkerContextProxy::LastChanceOption input) {
+  return static_cast<content::BackgroundSyncEventLastChance>(input);
+}
+
 }  // namespace mojo
diff --git a/content/child/background_sync/background_sync_type_converters.h b/content/child/background_sync/background_sync_type_converters.h
index ea1c9a9..d29d3408 100644
--- a/content/child/background_sync/background_sync_type_converters.h
+++ b/content/child/background_sync/background_sync_type_converters.h
@@ -10,6 +10,7 @@
 #include "content/common/content_export.h"
 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncError.h"
 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h"
+#include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h"
 #include "third_party/mojo/src/mojo/public/cpp/bindings/type_converter.h"
 
 namespace mojo {
@@ -82,6 +83,25 @@
       const blink::WebSyncRegistration& input);
 };
 
+// blink::WebServiceWorkerContextProxy::LastChanceOption <=>
+//    content::BackgroundSyncEventLastChance
+
+template <>
+struct CONTENT_EXPORT
+    TypeConverter<blink::WebServiceWorkerContextProxy::LastChanceOption,
+                  content::BackgroundSyncEventLastChance> {
+  static blink::WebServiceWorkerContextProxy::LastChanceOption Convert(
+      content::BackgroundSyncEventLastChance input);
+};
+
+template <>
+struct CONTENT_EXPORT
+    TypeConverter<content::BackgroundSyncEventLastChance,
+                  blink::WebServiceWorkerContextProxy::LastChanceOption> {
+  static content::BackgroundSyncEventLastChance Convert(
+      blink::WebServiceWorkerContextProxy::LastChanceOption input);
+};
+
 }  // namespace mojo
 
 #endif  // CONTENT_CHILD_BACKGROUND_SYNC_BACKGROUND_SYNC_TYPE_CONVERTERS_H_
diff --git a/content/common/background_sync_service.mojom b/content/common/background_sync_service.mojom
index 18d3ac8..159f828 100644
--- a/content/common/background_sync_service.mojom
+++ b/content/common/background_sync_service.mojom
@@ -24,7 +24,12 @@
   FAILED,
   SUCCESS,
   UNREGISTERED
- };
+};
+
+enum BackgroundSyncEventLastChance {
+  IS_NOT_LAST_CHANCE,
+  IS_LAST_CHANCE
+};
 
 interface BackgroundSyncService {
   Register(SyncRegistration options, int64 service_worker_registration_id,
@@ -36,19 +41,19 @@
   GetRegistrations(BackgroundSyncPeriodicity periodicity,
                    int64 service_worker_registration_id)
       => (BackgroundSyncError err, array<SyncRegistration> registrations);
-  Unregister(int64 handle_id, int64 service_worker_registration_id) 
+  Unregister(int64 handle_id, int64 service_worker_registration_id)
       => (BackgroundSyncError err);
   GetPermissionStatus(BackgroundSyncPeriodicity periodicity,
                       int64 service_worker_registration_id)
       => (BackgroundSyncError err, PermissionStatus status);
-  DuplicateRegistrationHandle(int64 handle_id) 
-      => (BackgroundSyncError err, SyncRegistration? registration);  
+  DuplicateRegistrationHandle(int64 handle_id)
+      => (BackgroundSyncError err, SyncRegistration? registration);
   ReleaseRegistration(int64 handle_id);
   NotifyWhenFinished(int64 handle_id) => (BackgroundSyncError err, BackgroundSyncState final_status);
 };
 
 interface BackgroundSyncServiceClient {
-  Sync(int64 handle_id)
+  Sync(int64 handle_id, BackgroundSyncEventLastChance last_chance)
       => (ServiceWorkerEventStatus status);
 };
 
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 0f8efbf..945d3587 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -154,6 +154,7 @@
 IPC_STRUCT_TRAITS_BEGIN(content::FrameNavigateParams)
   IPC_STRUCT_TRAITS_MEMBER(page_id)
   IPC_STRUCT_TRAITS_MEMBER(nav_entry_id)
+  IPC_STRUCT_TRAITS_MEMBER(frame_unique_name)
   IPC_STRUCT_TRAITS_MEMBER(item_sequence_number)
   IPC_STRUCT_TRAITS_MEMBER(document_sequence_number)
   IPC_STRUCT_TRAITS_MEMBER(url)
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc
index a26854f..595b02f 100644
--- a/content/common/gpu/gpu_command_buffer_stub.cc
+++ b/content/common/gpu/gpu_command_buffer_stub.cc
@@ -242,6 +242,10 @@
   use_virtualized_gl_context_ |=
       context_group_->feature_info()->workarounds().use_virtualized_gl_contexts;
 
+  // MailboxManagerSync synchronization correctness currently depends on having
+  // only a single context. See crbug.com/510243 for details.
+  use_virtualized_gl_context_ |= mailbox_manager->UsesSync();
+
   if (offscreen && initial_size_.IsEmpty()) {
     // If we're an offscreen surface with zero width and/or height, set to a
     // non-zero size so that we have a complete framebuffer for operations like
diff --git a/content/common/presentation/presentation_service.mojom b/content/common/presentation/presentation_service.mojom
index d46981d..3256a965 100644
--- a/content/common/presentation/presentation_service.mojom
+++ b/content/common/presentation/presentation_service.mojom
@@ -9,9 +9,10 @@
   string id;
 };
 
-enum PresentationSessionState {
+enum PresentationConnectionState {
   CONNECTED,
-  DISCONNECTED
+  CLOSED,
+  TERMINATED
 };
 
 enum PresentationErrorType {
@@ -121,8 +122,8 @@
 
   // See PresentationService::ListenForSessionStateChange.
   OnSessionStateChanged(PresentationSessionInfo sessionInfo,
-                        PresentationSessionState newState);
+                        PresentationConnectionState newState);
 
   // See PresentationService::ListenForSessionMessages.
   OnSessionMessagesReceived(PresentationSessionInfo sessionInfo, array<SessionMessage> messages);
-};
+}; 
diff --git a/content/common/sandbox_linux/bpf_gpu_policy_linux.cc b/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
index 8f7fd64d..e8c31279 100644
--- a/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
+++ b/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
@@ -191,7 +191,7 @@
 #endif  // !defined(__aarch64__)
     case __NR_faccessat:
     case __NR_openat:
-#if !defined(OS_CHROMEOS)
+#if !defined(OS_CHROMEOS) && !defined(__aarch64__)
     // The broker process needs to able to unlink the temporary
     // files that it may create. This is used by DRI3.
     case __NR_unlink:
diff --git a/content/common/swapped_out_messages.cc b/content/common/swapped_out_messages.cc
index f937a7f..7980014 100644
--- a/content/common/swapped_out_messages.cc
+++ b/content/common/swapped_out_messages.cc
@@ -31,6 +31,8 @@
     case ViewHostMsg_DocumentDetached::ID:
     // Allow cross-process JavaScript calls.
     case ViewHostMsg_RouteCloseEvent::ID:
+    // Send page scale factor reset notification upon cross-process navigations.
+    case ViewHostMsg_PageScaleFactorChanged::ID:
     // Handled by RenderFrameHost.
     case FrameHostMsg_BeforeUnload_ACK::ID:
     case FrameHostMsg_SwapOut_ACK::ID:
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index c1a3d36..3421e4af 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -699,8 +699,8 @@
                     gfx::Point, /* location */
                     blink::WebPluginAction)
 
-// Resets the page scale for the current main frame to the default page scale.
-IPC_MESSAGE_ROUTED0(ViewMsg_ResetPageScale)
+// Sets the page scale for the current main frame to the given page scale.
+IPC_MESSAGE_ROUTED1(ViewMsg_SetPageScale, float /* page_scale_factor */)
 
 // Change the zoom level for the current main frame.  If the level actually
 // changes, a ViewHostMsg_DidZoomURL message will be sent back to the browser
@@ -1251,9 +1251,9 @@
                     double /* zoom_level */,
                     GURL /* url */)
 
-// Sent when the renderer changes its page scale factor and whether or not the
-// page scale factor is one changes.
-IPC_MESSAGE_ROUTED1(ViewHostMsg_PageScaleFactorIsOneChanged, bool /* is_one */)
+// Sent when the renderer changes its page scale factor.
+IPC_MESSAGE_ROUTED1(ViewHostMsg_PageScaleFactorChanged,
+                    float /* page_scale_factor */)
 
 // Updates the minimum/maximum allowed zoom percent for this tab from the
 // default values.  If |remember| is true, then the zoom setting is applied to
diff --git a/content/public/browser/background_tracing_manager.h b/content/public/browser/background_tracing_manager.h
index ba3d99ce..652047e4 100644
--- a/content/public/browser/background_tracing_manager.h
+++ b/content/public/browser/background_tracing_manager.h
@@ -42,7 +42,7 @@
   // }
   //
   typedef base::Callback<void(const scoped_refptr<base::RefCountedString>&,
-                              scoped_ptr<base::DictionaryValue>,
+                              scoped_ptr<const base::DictionaryValue>,
                               base::Closure)> ReceiveCallback;
 
   // Set the triggering rules for when to start recording.
diff --git a/content/public/browser/navigation_details.h b/content/public/browser/navigation_details.h
index 19c852d..b344105 100644
--- a/content/public/browser/navigation_details.h
+++ b/content/public/browser/navigation_details.h
@@ -35,7 +35,8 @@
   // if there are no previous entries.
   int previous_entry_index;
 
-  // The previous URL that the user was on. This may be empty if none.
+  // The previous main frame URL that the user was on. This may be empty if
+  // there was no last committed entry.
   GURL previous_url;
 
   // True if the committed entry has replaced the exisiting one.
diff --git a/content/public/browser/presentation_service_delegate.h b/content/public/browser/presentation_service_delegate.h
index 1f5e928..5c4e5c8 100644
--- a/content/public/browser/presentation_service_delegate.h
+++ b/content/public/browser/presentation_service_delegate.h
@@ -21,7 +21,7 @@
 
 using SessionStateChangedCallback =
     base::Callback<void(const PresentationSessionInfo&,
-                        PresentationSessionState)>;
+                        PresentationConnectionState)>;
 
 // Param #0: a vector of messages that are received.
 // Param #1: tells the callback handler that it may reuse strings or buffers
diff --git a/content/public/browser/presentation_session.h b/content/public/browser/presentation_session.h
index 48921484..d000e8a 100644
--- a/content/public/browser/presentation_session.h
+++ b/content/public/browser/presentation_session.h
@@ -11,11 +11,13 @@
 
 namespace content {
 
-enum PresentationSessionState {
-  PRESENTATION_SESSION_STATE_CONNECTED,
-  PRESENTATION_SESSION_STATE_DISCONNECTED
+enum PresentationConnectionState {
+  PRESENTATION_CONNECTION_STATE_CONNECTED,
+  PRESENTATION_CONNECTION_STATE_CLOSED,
+  PRESENTATION_CONNECTION_STATE_TERMINATED
 };
 
+// TODO(imcheng): Rename to PresentationConnectionInfo.
 // Represents a presentation session that has been established via either
 // browser actions or Presentation API.
 struct CONTENT_EXPORT PresentationSessionInfo {
diff --git a/content/public/browser/trace_uploader.h b/content/public/browser/trace_uploader.h
index 88f5c48e..24e99e2 100644
--- a/content/public/browser/trace_uploader.h
+++ b/content/public/browser/trace_uploader.h
@@ -30,7 +30,7 @@
   // Compresses and uploads the given file contents.
   virtual void DoUpload(const std::string& file_contents,
                         UploadMode upload_mode,
-                        scoped_ptr<base::DictionaryValue> metadata,
+                        scoped_ptr<const base::DictionaryValue> metadata,
                         const UploadProgressCallback& progress_callback,
                         const UploadDoneCallback& done_callback) = 0;
 };
diff --git a/content/public/browser/tracing_controller.h b/content/public/browser/tracing_controller.h
index 9863c06..f405d67 100644
--- a/content/public/browser/tracing_controller.h
+++ b/content/public/browser/tracing_controller.h
@@ -11,6 +11,7 @@
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/trace_event/trace_event.h"
+#include "base/values.h"
 #include "content/common/content_export.h"
 
 namespace content {
@@ -38,7 +39,12 @@
    public:
     virtual void AddTraceChunk(const std::string& chunk) {}
     virtual void SetSystemTrace(const std::string& data) {}
-    virtual void SetMetadata(const std::string& data) {}
+
+    // Notice that TracingController adds some default metadata when
+    // DisableRecording is called, which may override metadata that you would
+    // set beforehand in case of key collision.
+    virtual void AddMetadata(const base::DictionaryValue& data);
+    virtual const base::DictionaryValue& GetMetadata() const;
     // TODO(prabhur) Replace all the Set* functions with a generic function:
     // TraceDataSink::AppendAdditionalData(const std::string& name,
     // const std::string& trace_data)
@@ -48,6 +54,9 @@
    protected:
     friend class base::RefCountedThreadSafe<TraceDataSink>;
     virtual ~TraceDataSink() {}
+
+   private:
+    base::DictionaryValue metadata_;
   };
 
   // An implementation of this interface is passed when constructing a
@@ -58,7 +67,9 @@
       : public base::RefCountedThreadSafe<TraceDataEndpoint> {
    public:
     virtual void ReceiveTraceChunk(const std::string& chunk) {}
-    virtual void ReceiveTraceFinalContents(const std::string& contents) {}
+    virtual void ReceiveTraceFinalContents(
+      scoped_ptr<const base::DictionaryValue> metadata,
+      const std::string& contents) {}
 
    protected:
     friend class base::RefCountedThreadSafe<TraceDataEndpoint>;
@@ -68,7 +79,8 @@
   // Create a trace sink that may be supplied to DisableRecording or
   // CaptureMonitoringSnapshot to capture the trace data as a string.
   CONTENT_EXPORT static scoped_refptr<TraceDataSink> CreateStringSink(
-      const base::Callback<void(base::RefCountedString*)>& callback);
+      const base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                                base::RefCountedString*)>& callback);
 
   CONTENT_EXPORT static scoped_refptr<TraceDataSink> CreateCompressedStringSink(
       scoped_refptr<TraceDataEndpoint> endpoint);
@@ -82,7 +94,8 @@
   // Create an endpoint that may be supplied to any TraceDataSink to
   // dump the trace data to a callback.
   CONTENT_EXPORT static scoped_refptr<TraceDataEndpoint> CreateCallbackEndpoint(
-      const base::Callback<void(base::RefCountedString*)>& callback);
+      const base::Callback<void(scoped_ptr<const base::DictionaryValue>,
+                                base::RefCountedString*)>& callback);
 
   // Create an endpoint that may be supplied to any TraceDataSink to
   // dump the trace data to a file.
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index a0ea79f..c4528a4 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -577,8 +577,8 @@
   virtual int GetMinimumZoomPercent() const = 0;
   virtual int GetMaximumZoomPercent() const = 0;
 
-  // Set the renderer's page scale back to one.
-  virtual void ResetPageScale() = 0;
+  // Set the renderer's page scale to the given factor.
+  virtual void SetPageScale(float page_scale_factor) = 0;
 
   // Gets the preferred size of the contents.
   virtual gfx::Size GetPreferredSize() const = 0;
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h
index afaa5816..92bf977 100644
--- a/content/public/browser/web_contents_observer.h
+++ b/content/public/browser/web_contents_observer.h
@@ -434,6 +434,9 @@
   virtual void MediaSessionStateChanged(bool is_controllable,
                                         bool is_suspended) {}
 
+  // Invoked when the renderer process changes the page scale factor.
+  virtual void OnPageScaleFactorChanged(float page_scale_factor) {}
+
   // Invoked if an IPC message is coming from a specific RenderFrameHost.
   virtual bool OnMessageReceived(const IPC::Message& message,
                                  RenderFrameHost* render_frame_host);
diff --git a/content/public/common/frame_navigate_params.h b/content/public/common/frame_navigate_params.h
index e3b93342..9e006c08 100644
--- a/content/public/common/frame_navigate_params.h
+++ b/content/public/common/frame_navigate_params.h
@@ -33,6 +33,9 @@
   // means. If the navigation was renderer-initiated, this value is 0.
   int nav_entry_id;
 
+  // The unique name of the frame in which this navigation takes place.
+  std::string frame_unique_name;
+
   // The item sequence number identifies each stop in the session history.  It
   // is unique within the renderer process and makes a best effort to be unique
   // across browser sessions (using a renderer process timestamp).
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
index 3d0316f0..32004d1 100644
--- a/content/public/renderer/content_renderer_client.cc
+++ b/content/public/renderer/content_renderer_client.cc
@@ -98,20 +98,6 @@
   return false;
 }
 
-#ifdef OS_ANDROID
-bool ContentRendererClient::HandleNavigation(
-    RenderFrame* render_frame,
-    bool is_content_initiated,
-    int opener_id,
-    blink::WebFrame* frame,
-    const blink::WebURLRequest& request,
-    blink::WebNavigationType type,
-    blink::WebNavigationPolicy default_policy,
-    bool is_redirect) {
-  return false;
-}
-#endif
-
 bool ContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
                                        const GURL& url,
                                        const std::string& http_method,
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index f55c691..59d448c 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -16,8 +16,6 @@
 #include "base/strings/string16.h"
 #include "content/public/common/content_client.h"
 #include "third_party/WebKit/public/platform/WebPageVisibilityState.h"
-#include "third_party/WebKit/public/web/WebNavigationPolicy.h"
-#include "third_party/WebKit/public/web/WebNavigationType.h"
 #include "ui/base/page_transition_types.h"
 #include "v8/include/v8.h"
 
@@ -192,23 +190,6 @@
   // Returns true if a popup window should be allowed.
   virtual bool AllowPopup();
 
-#ifdef OS_ANDROID
-  // TODO(sgurun) This callback is deprecated and will be removed as soon
-  // as android webview completes implementation of a resource throttle based
-  // shouldoverrideurl implementation. See crbug.com/325351
-  //
-  // Returns true if the navigation was handled by the embedder and should be
-  // ignored by WebKit. This method is used by CEF and android_webview.
-  virtual bool HandleNavigation(RenderFrame* render_frame,
-                                bool is_content_initiated,
-                                int opener_id,
-                                blink::WebFrame* frame,
-                                const blink::WebURLRequest& request,
-                                blink::WebNavigationType type,
-                                blink::WebNavigationPolicy default_policy,
-                                bool is_redirect);
-#endif
-
   // Returns true if we should fork a new process for the given navigation.
   // If |send_referrer| is set to false (which is the default), no referrer
   // header will be send for the navigation. Otherwise, the referrer header is
diff --git a/content/renderer/background_sync/background_sync_client_impl.cc b/content/renderer/background_sync/background_sync_client_impl.cc
index ea65623..d0a7e9f 100644
--- a/content/renderer/background_sync/background_sync_client_impl.cc
+++ b/content/renderer/background_sync/background_sync_client_impl.cc
@@ -11,6 +11,7 @@
 #include "third_party/WebKit/public/platform/WebThread.h"
 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h"
 #include "third_party/WebKit/public/platform/modules/background_sync/WebSyncRegistration.h"
+#include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h"
 
 namespace content {
 
@@ -30,8 +31,10 @@
       binding_(this, request.Pass()),
       callback_seq_num_(0) {}
 
-void BackgroundSyncClientImpl::Sync(int64_t handle_id,
-                                    const SyncCallback& callback) {
+void BackgroundSyncClientImpl::Sync(
+    int64_t handle_id,
+    content::BackgroundSyncEventLastChance last_chance,
+    const SyncCallback& callback) {
   DCHECK(!blink::Platform::current()->mainThread()->isCurrentThread());
   // Get a registration for the given handle_id from the provider. This way
   // the provider knows about the handle and can delete it once Blink releases
@@ -55,11 +58,12 @@
   sync_callbacks_[id] = callback;
   provider->DuplicateRegistrationHandle(
       handle_id, base::Bind(&BackgroundSyncClientImpl::SyncDidGetRegistration,
-                            base::Unretained(this), id));
+                            base::Unretained(this), id, last_chance));
 }
 
 void BackgroundSyncClientImpl::SyncDidGetRegistration(
     int64_t callback_id,
+    content::BackgroundSyncEventLastChance last_chance,
     BackgroundSyncError error,
     SyncRegistrationPtr registration) {
   SyncCallback callback;
@@ -83,7 +87,11 @@
   scoped_ptr<blink::WebSyncRegistration> web_registration =
       mojo::ConvertTo<scoped_ptr<blink::WebSyncRegistration>>(registration);
 
-  client->DispatchSyncEvent(*web_registration, callback);
+  blink::WebServiceWorkerContextProxy::LastChanceOption web_last_chance =
+      mojo::ConvertTo<blink::WebServiceWorkerContextProxy::LastChanceOption>(
+          last_chance);
+
+  client->DispatchSyncEvent(*web_registration, web_last_chance, callback);
 }
 
 }  // namespace content
diff --git a/content/renderer/background_sync/background_sync_client_impl.h b/content/renderer/background_sync/background_sync_client_impl.h
index b442d087..e9e36f9d 100644
--- a/content/renderer/background_sync/background_sync_client_impl.h
+++ b/content/renderer/background_sync/background_sync_client_impl.h
@@ -31,10 +31,14 @@
       mojo::InterfaceRequest<BackgroundSyncServiceClient> request);
 
   // BackgroundSyncServiceClient methods:
-  void Sync(int64_t handle_id, const SyncCallback& callback) override;
-  void SyncDidGetRegistration(int64_t callback_id,
-                              BackgroundSyncError error,
-                              SyncRegistrationPtr registration);
+  void Sync(int64_t handle_id,
+            content::BackgroundSyncEventLastChance last_chance,
+            const SyncCallback& callback) override;
+  void SyncDidGetRegistration(
+      int64_t callback_id,
+      content::BackgroundSyncEventLastChance last_chance,
+      BackgroundSyncError error,
+      SyncRegistrationPtr registration);
 
   int64_t service_worker_registration_id_;
   mojo::StrongBinding<BackgroundSyncServiceClient> binding_;
diff --git a/content/renderer/media/audio_repetition_detector.cc b/content/renderer/media/audio_repetition_detector.cc
index 17b7499..5d318f7 100644
--- a/content/renderer/media/audio_repetition_detector.cc
+++ b/content/renderer/media/audio_repetition_detector.cc
@@ -21,6 +21,7 @@
     const RepetitionCallback& repetition_callback)
     : max_look_back_ms_(0),
       min_length_ms_(min_length_ms),
+      num_channels_(0),
       sample_rate_(0),
       buffer_size_frames_(0),
       buffer_end_index_(0),
diff --git a/content/renderer/media/rtc_peer_connection_handler.cc b/content/renderer/media/rtc_peer_connection_handler.cc
index 90d0f8d..6dfe0d9f 100644
--- a/content/renderer/media/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/rtc_peer_connection_handler.cc
@@ -331,7 +331,9 @@
 
  protected:
   ~CreateSessionDescriptionRequest() override {
-    CHECK(webkit_request_.isNull());
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    DLOG_IF(ERROR, !webkit_request_.isNull())
+        << "CreateSessionDescriptionRequest not completed. Shutting down?";
   }
 
   const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
@@ -378,7 +380,9 @@
 
  protected:
   ~SetSessionDescriptionRequest() override {
-    DCHECK(webkit_request_.isNull());
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    DLOG_IF(ERROR, !webkit_request_.isNull())
+        << "SetSessionDescriptionRequest not completed. Shutting down?";
   }
 
  private:
diff --git a/content/renderer/presentation/presentation_dispatcher.cc b/content/renderer/presentation/presentation_dispatcher.cc
index a2c7bc8..9eb9c6795 100644
--- a/content/renderer/presentation/presentation_dispatcher.cc
+++ b/content/renderer/presentation/presentation_dispatcher.cc
@@ -39,16 +39,18 @@
 }
 
 blink::WebPresentationConnectionState GetWebPresentationConnectionStateFromMojo(
-        presentation::PresentationSessionState mojoSessionState) {
+    presentation::PresentationConnectionState mojoSessionState) {
   switch (mojoSessionState) {
-    case presentation::PRESENTATION_SESSION_STATE_CONNECTED:
+    case presentation::PRESENTATION_CONNECTION_STATE_CONNECTED:
       return blink::WebPresentationConnectionState::Connected;
-    case presentation::PRESENTATION_SESSION_STATE_DISCONNECTED:
-      return blink::WebPresentationConnectionState::Disconnected;
+    case presentation::PRESENTATION_CONNECTION_STATE_CLOSED:
+      return blink::WebPresentationConnectionState::Closed;
+    case presentation::PRESENTATION_CONNECTION_STATE_TERMINATED:
+      return blink::WebPresentationConnectionState::Terminated;
   }
 
   NOTREACHED();
-  return blink::WebPresentationConnectionState::Disconnected;
+  return blink::WebPresentationConnectionState::Terminated;
 }
 
 }  // namespace
@@ -368,7 +370,7 @@
 
 void PresentationDispatcher::OnSessionStateChanged(
     presentation::PresentationSessionInfoPtr session_info,
-    presentation::PresentationSessionState session_state) {
+    presentation::PresentationConnectionState session_state) {
   if (!controller_)
     return;
 
diff --git a/content/renderer/presentation/presentation_dispatcher.h b/content/renderer/presentation/presentation_dispatcher.h
index 08ae828..54c259b 100644
--- a/content/renderer/presentation/presentation_dispatcher.h
+++ b/content/renderer/presentation/presentation_dispatcher.h
@@ -96,7 +96,7 @@
                                    bool available) override;
   void OnSessionStateChanged(
       presentation::PresentationSessionInfoPtr session_info,
-      presentation::PresentationSessionState new_state) override;
+      presentation::PresentationConnectionState new_state) override;
   void OnSessionMessagesReceived(
       presentation::PresentationSessionInfoPtr session_info,
       mojo::Array<presentation::SessionMessagePtr> messages) override;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 5a9da31..0d2acf7 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -116,6 +116,7 @@
 #include "gin/modules/module_registry.h"
 #include "media/base/audio_renderer_mixer_input.h"
 #include "media/base/media_log.h"
+#include "media/base/media_switches.h"
 #include "media/blink/webencryptedmediaclient_impl.h"
 #include "media/blink/webmediaplayer_impl.h"
 #include "media/renderers/gpu_video_accelerator_factories.h"
@@ -2150,10 +2151,10 @@
   RenderThreadImpl* render_thread = RenderThreadImpl::current();
 
 #if defined(OS_ANDROID) && !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
-  scoped_refptr<media::AudioRendererSink> audio_renderer_sink;
+  scoped_refptr<media::RestartableAudioRendererSink> audio_renderer_sink;
   media::WebMediaPlayerParams::Context3DCB context_3d_cb;
 #else
-  scoped_refptr<media::AudioRendererSink> audio_renderer_sink =
+  scoped_refptr<media::RestartableAudioRendererSink> audio_renderer_sink =
       render_thread->GetAudioRendererMixerManager()->CreateInput(
           routing_id_, sink_id.utf8(), frame->securityOrigin());
   media::WebMediaPlayerParams::Context3DCB context_3d_cb =
@@ -2176,6 +2177,13 @@
 #if defined(OS_ANDROID) && !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
   return CreateAndroidWebMediaPlayer(client, encrypted_client, params);
 #else
+#if defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
+  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableUnifiedMediaPipeline)) {
+    return CreateAndroidWebMediaPlayer(client, encrypted_client, params);
+  }
+#endif  // defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
+
 #if defined(ENABLE_MOJO_MEDIA) && !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
   scoped_ptr<media::RendererFactory> media_renderer_factory(
       new media::MojoRendererFactory(GetMediaServiceFactory()));
@@ -2190,7 +2198,7 @@
         *render_thread->GetAudioHardwareConfig()));
   }
 #endif  // defined(ENABLE_MOJO_MEDIA) &&
-  // !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
+        // !defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID)
 
   return new media::WebMediaPlayerImpl(
       frame, client, encrypted_client, weak_factory_.GetWeakPtr(),
@@ -4159,6 +4167,7 @@
     params.page_state = SingleHistoryItemToPageState(item);
     post_id = ExtractPostId(item);
   }
+  params.frame_unique_name = item.target().utf8();
   params.item_sequence_number = item.itemSequenceNumber();
   params.document_sequence_number = item.documentSequenceNumber();
 
@@ -4401,18 +4410,6 @@
       (pending_navigation_params_ &&
        !pending_navigation_params_->request_params.redirects.empty());
 
-#ifdef OS_ANDROID
-  // The handlenavigation API is deprecated and will be removed once
-  // crbug.com/325351 is resolved.
-  if (info.urlRequest.url() != GURL(kSwappedOutURL) &&
-      GetContentClient()->renderer()->HandleNavigation(
-          this, is_content_initiated, render_view_->opener_id_, frame_,
-          info.urlRequest, info.navigationType, info.defaultPolicy,
-          is_redirect)) {
-    return blink::WebNavigationPolicyIgnore;
-  }
-#endif
-
   Referrer referrer(
       RenderViewImpl::GetReferrerFromRequest(frame_, info.urlRequest));
 
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index d0a0f806..5149177b 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -659,8 +659,7 @@
       pepper_last_mouse_event_target_(NULL),
 #endif
       enumeration_completion_id_(0),
-      session_storage_namespace_id_(params.session_storage_namespace_id),
-      page_scale_factor_is_one_(true) {
+      session_storage_namespace_id_(params.session_storage_namespace_id) {
 }
 
 void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
@@ -1303,7 +1302,7 @@
     IPC_MESSAGE_HANDLER(ViewMsg_SaveImageAt, OnSaveImageAt)
     IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind)
     IPC_MESSAGE_HANDLER(ViewMsg_StopFinding, OnStopFinding)
-    IPC_MESSAGE_HANDLER(ViewMsg_ResetPageScale, OnResetPageScale)
+    IPC_MESSAGE_HANDLER(ViewMsg_SetPageScale, OnSetPageScale)
     IPC_MESSAGE_HANDLER(ViewMsg_Zoom, OnZoom)
     IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForLoadingURL,
                         OnSetZoomLevelForLoadingURL)
@@ -2471,10 +2470,10 @@
 }
 #endif
 
-void RenderViewImpl::OnResetPageScale() {
+void RenderViewImpl::OnSetPageScale(float page_scale_factor) {
   if (!webview())
     return;
-  webview()->setPageScaleFactor(1);
+  webview()->setPageScaleFactor(page_scale_factor);
 }
 
 void RenderViewImpl::OnZoom(PageZoom zoom) {
@@ -3393,12 +3392,9 @@
 void RenderViewImpl::pageScaleFactorChanged() {
   if (!webview())
     return;
-  bool page_scale_factor_is_one = webview()->pageScaleFactor() == 1;
-  if (page_scale_factor_is_one == page_scale_factor_is_one_)
-    return;
-  page_scale_factor_is_one_ = page_scale_factor_is_one;
-  Send(new ViewHostMsg_PageScaleFactorIsOneChanged(routing_id_,
-                                                   page_scale_factor_is_one_));
+
+  Send(new ViewHostMsg_PageScaleFactorChanged(routing_id_,
+                                              webview()->pageScaleFactor()));
 }
 
 double RenderViewImpl::zoomLevelToZoomFactor(double zoom_level) const {
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 8dd24d2de..c2527cdc 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -662,7 +662,7 @@
   void OnThemeChanged();
   void OnUpdateTargetURLAck();
   void OnUpdateWebPreferences(const WebPreferences& prefs);
-  void OnResetPageScale();
+  void OnSetPageScale(float page_scale_factor);
   void OnZoom(PageZoom zoom);
   void OnEnableViewSourceMode();
   void OnForceRedraw(int request_id);
@@ -1016,8 +1016,6 @@
   typedef std::map<cc::SharedBitmapId, cc::SharedBitmap*> BitmapMap;
   BitmapMap disambiguation_bitmaps_;
 
-  bool page_scale_factor_is_one_;
-
   // ---------------------------------------------------------------------------
   // ADDING NEW DATA? Please see if it fits appropriately in one of the above
   // sections rather than throwing it randomly at the end. If you're adding a
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index a61f86e9..f11338fb 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -657,12 +657,13 @@
 
 void ServiceWorkerContextClient::DispatchSyncEvent(
     const blink::WebSyncRegistration& registration,
+    blink::WebServiceWorkerContextProxy::LastChanceOption last_chance,
     const SyncCallback& callback) {
   TRACE_EVENT0("ServiceWorker",
                "ServiceWorkerContextClient::DispatchSyncEvent");
   int request_id =
       context_->sync_event_callbacks.Add(new SyncCallback(callback));
-  proxy_->dispatchSyncEvent(request_id, registration);
+  proxy_->dispatchSyncEvent(request_id, registration, last_chance);
 }
 
 void ServiceWorkerContextClient::Send(IPC::Message* message) {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 6c8ae16..b3fd33d9 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -23,6 +23,7 @@
 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerError.h"
 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
+#include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h"
 #include "v8/include/v8.h"
 
 namespace base {
@@ -160,8 +161,10 @@
   void registerForeignFetchScopes(
       const blink::WebVector<blink::WebURL>& sub_scopes) override;
 
-  virtual void DispatchSyncEvent(const blink::WebSyncRegistration& registration,
-                                 const SyncCallback& callback);
+  virtual void DispatchSyncEvent(
+      const blink::WebSyncRegistration& registration,
+      blink::WebServiceWorkerContextProxy::LastChanceOption last_chance,
+      const SyncCallback& callback);
 
  private:
   struct WorkerContextData;
diff --git a/content/test/net/url_request_abort_on_end_job.cc b/content/test/net/url_request_abort_on_end_job.cc
index 6d237a8..f7ff5a9 100644
--- a/content/test/net/url_request_abort_on_end_job.cc
+++ b/content/test/net/url_request_abort_on_end_job.cc
@@ -8,7 +8,6 @@
 
 #include "base/compiler_specific.h"
 #include "base/location.h"
-#include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/thread_task_runner_handle.h"
@@ -112,16 +111,20 @@
                             weak_factory_.GetWeakPtr()));
 }
 
-int URLRequestAbortOnEndJob::ReadRawData(net::IOBuffer* buf, int max_bytes) {
+bool URLRequestAbortOnEndJob::ReadRawData(net::IOBuffer* buf,
+                                          const int max_bytes,
+                                          int* bytes_read) {
   if (!sent_data_) {
-    max_bytes =
-        std::min(max_bytes, base::checked_cast<int>(sizeof(kPageContent)));
-    std::memcpy(buf->data(), kPageContent, max_bytes);
+    *bytes_read = std::min(size_t(max_bytes), sizeof(kPageContent));
+    std::memcpy(buf->data(), kPageContent, *bytes_read);
     sent_data_ = true;
-    return max_bytes;
+    return true;
   }
 
-  return net::ERR_CONNECTION_ABORTED;
+  SetStatus(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+                                  net::ERR_CONNECTION_ABORTED));
+  *bytes_read = -1;
+  return false;
 }
 
 }  // namespace content
diff --git a/content/test/net/url_request_abort_on_end_job.h b/content/test/net/url_request_abort_on_end_job.h
index 8a95533..88e348c 100644
--- a/content/test/net/url_request_abort_on_end_job.h
+++ b/content/test/net/url_request_abort_on_end_job.h
@@ -29,7 +29,7 @@
   void Start() override;
   bool GetMimeType(std::string* mime_type) const override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   static void AddUrlHandler();
 
diff --git a/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.cc b/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.cc
index ee42421..3aabff5 100644
--- a/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.cc
+++ b/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.cc
@@ -29,9 +29,8 @@
 }  // namespace
 
 BluetoothApiPairingDelegate::BluetoothApiPairingDelegate(
-    const std::string& extension_id,
     content::BrowserContext* browser_context)
-    : extension_id_(extension_id), browser_context_(browser_context) {}
+    : browser_context_(browser_context) {}
 
 BluetoothApiPairingDelegate::~BluetoothApiPairingDelegate() {}
 
@@ -105,8 +104,7 @@
   scoped_ptr<Event> event(new Event(events::BLUETOOTH_PRIVATE_ON_PAIRING,
                                     bt_private::OnPairing::kEventName,
                                     args.Pass()));
-  EventRouter::Get(browser_context_)
-      ->DispatchEventToExtension(extension_id_, event.Pass());
+  EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass());
 }
 
 }  // namespace extensions
diff --git a/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h b/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h
index 61e1512..222375c 100644
--- a/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h
+++ b/extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/macros.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "extensions/common/api/bluetooth_private.h"
 
@@ -21,8 +22,8 @@
 class BluetoothApiPairingDelegate
     : public device::BluetoothDevice::PairingDelegate {
  public:
-  BluetoothApiPairingDelegate(const std::string& extension_id,
-                              content::BrowserContext* browser_context);
+  explicit BluetoothApiPairingDelegate(
+      content::BrowserContext* browser_context);
   ~BluetoothApiPairingDelegate() override;
 
   // device::PairingDelegate overrides:
@@ -40,8 +41,9 @@
   void DispatchPairingEvent(
       const api::bluetooth_private::PairingEvent& pairing_event);
 
-  std::string extension_id_;
   content::BrowserContext* browser_context_;
+
+  DISALLOW_COPY_AND_ASSIGN(BluetoothApiPairingDelegate);
 };
 
 }  // namespace extensions
diff --git a/extensions/browser/api/bluetooth/bluetooth_api_utils.cc b/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
index 860b02a5..1b0c61e6 100644
--- a/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
+++ b/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
@@ -111,6 +111,8 @@
 
   out->paired.reset(new bool(device.IsPaired()));
   out->connected.reset(new bool(device.IsConnected()));
+  out->connecting.reset(new bool(device.IsConnecting()));
+  out->connectable.reset(new bool(device.IsConnectable()));
 
   std::vector<std::string>* string_uuids = new std::vector<std::string>();
   const device::BluetoothDevice::UUIDList& uuids = device.GetUUIDs();
diff --git a/extensions/browser/api/bluetooth/bluetooth_event_router.cc b/extensions/browser/api/bluetooth/bluetooth_event_router.cc
index 47920c66..5de177d 100644
--- a/extensions/browser/api/bluetooth/bluetooth_event_router.cc
+++ b/extensions/browser/api/bluetooth/bluetooth_event_router.cc
@@ -232,7 +232,7 @@
   }
   if (!ContainsKey(pairing_delegate_map_, extension_id)) {
     BluetoothApiPairingDelegate* delegate =
-        new BluetoothApiPairingDelegate(extension_id, browser_context_);
+        new BluetoothApiPairingDelegate(browser_context_);
     DCHECK(adapter_.get());
     adapter_->AddPairingDelegate(
         delegate, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH);
diff --git a/extensions/browser/api/bluetooth/bluetooth_extension_function.cc b/extensions/browser/api/bluetooth/bluetooth_extension_function.cc
index 028f144a..09ee87d 100644
--- a/extensions/browser/api/bluetooth/bluetooth_extension_function.cc
+++ b/extensions/browser/api/bluetooth/bluetooth_extension_function.cc
@@ -6,6 +6,7 @@
 
 #include "base/memory/ref_counted.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
@@ -64,7 +65,7 @@
 std::string BluetoothExtensionFunction::GetExtensionId() {
   if (extension())
     return extension()->id();
-  return GetSenderWebContents()->GetURL().host();
+  return render_frame_host()->GetLastCommittedURL().host();
 }
 
 void BluetoothExtensionFunction::RunOnAdapterReady(
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index e9c34fc..67b8a725 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1152,6 +1152,8 @@
   TABCAPTURE_CAPTUREOFFSCREENTAB,
   LANGUAGESETTINGSPRIVATE_ADDSPELLCHECKWORD,
   LANGUAGESETTINGSPRIVATE_REMOVESPELLCHECKWORD,
+  SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION,
+  SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/value_store/leveldb_value_store.cc b/extensions/browser/value_store/leveldb_value_store.cc
index c11e655..4b38b7e 100644
--- a/extensions/browser/value_store/leveldb_value_store.cc
+++ b/extensions/browser/value_store/leveldb_value_store.cc
@@ -29,6 +29,16 @@
 const char kInvalidJson[] = "Invalid JSON";
 const char kCannotSerialize[] = "Cannot serialize value to JSON";
 
+// UMA values used when recovering from a corrupted leveldb.
+// Do not change/delete these values as you will break reporting for older
+// copies of Chrome. Only add new values to the end.
+enum LevelDBCorruptionRecoveryValue {
+  LEVELDB_RESTORE_DELETE_SUCCESS = 0,
+  LEVELDB_RESTORE_DELETE_FAILURE,
+  LEVELDB_RESTORE_REPAIR_SUCCESS,
+  LEVELDB_RESTORE_MAX
+};
+
 // Scoped leveldb snapshot which releases the snapshot on destruction.
 class ScopedSnapshot {
  public:
@@ -54,7 +64,7 @@
 
 LeveldbValueStore::LeveldbValueStore(const std::string& uma_client_name,
                                      const base::FilePath& db_path)
-    : db_path_(db_path), open_histogram_(nullptr) {
+    : db_path_(db_path), open_histogram_(nullptr), restore_histogram_(nullptr) {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
 
   // Used in lieu of UMA_HISTOGRAM_ENUMERATION because the histogram name is
@@ -63,6 +73,9 @@
       "Extensions.Database.Open." + uma_client_name, 1,
       leveldb_env::LEVELDB_STATUS_MAX, leveldb_env::LEVELDB_STATUS_MAX + 1,
       base::Histogram::kUmaTargetedHistogramFlag);
+  restore_histogram_ = base::LinearHistogram::FactoryGet(
+      "Extensions.Database.Restore." + uma_client_name, 1, LEVELDB_RESTORE_MAX,
+      LEVELDB_RESTORE_MAX + 1, base::Histogram::kUmaTargetedHistogramFlag);
   base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
       this, "LeveldbValueStore", base::ThreadTaskRunnerHandle::Get());
 }
@@ -287,28 +300,26 @@
 bool LeveldbValueStore::Restore() {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
 
-  ReadResult result = Get();
-  std::string previous_key;
-  while (result->IsCorrupted()) {
-    // If we don't have a specific corrupted key, or we've tried and failed to
-    // clear this specific key, or we fail to restore the key, then wipe the
-    // whole database.
-    if (!result->error().key.get() || *result->error().key == previous_key ||
-        !RestoreKey(*result->error().key)) {
-      DeleteDbFile();
-      result = Get();
-      break;
-    }
+  // Possible to have a corrupted open database, so first close it.
+  db_.reset();
 
-    // Otherwise, re-Get() the database to check if there is still any
-    // corruption.
-    previous_key = *result->error().key;
-    result = Get();
+  leveldb::Options options;
+  options.create_if_missing = true;
+
+  // Repair can drop an unbounded number of leveldb tables (key/value sets)
+  leveldb::Status status = leveldb::RepairDB(db_path_.AsUTF8Unsafe(), options);
+  if (status.ok()) {
+    restore_histogram_->Add(LEVELDB_RESTORE_REPAIR_SUCCESS);
+    return true;
   }
 
-  // If we still have an error, it means we've tried deleting the database file,
-  // and failed. There's nothing more we can do.
-  return !result->IsCorrupted();
+  if (DeleteDbFile()) {
+    restore_histogram_->Add(LEVELDB_RESTORE_DELETE_SUCCESS);
+    return true;
+  }
+
+  restore_histogram_->Add(LEVELDB_RESTORE_DELETE_FAILURE);
+  return false;
 }
 
 bool LeveldbValueStore::RestoreKey(const std::string& key) {
@@ -381,6 +392,12 @@
       leveldb::DB::Open(options, db_path_.AsUTF8Unsafe(), &db);
   if (open_histogram_)
     open_histogram_->Add(leveldb_env::GetLevelDBStatusUMAValue(status));
+  if (status.IsCorruption()) {
+    // Returning a corruption error should result in Restore() being called.
+    // However, since once a leveldb becomes corrupt it's unusable without
+    // some kind of repair or delete, so do that right now.
+    Restore();
+  }
   if (!status.ok())
     return ToValueStoreError(status, util::NoKey());
 
@@ -468,12 +485,14 @@
   return is_empty;
 }
 
-void LeveldbValueStore::DeleteDbFile() {
+bool LeveldbValueStore::DeleteDbFile() {
   db_.reset();  // release any lock on the directory
   if (!base::DeleteFile(db_path_, true /* recursive */)) {
     LOG(WARNING) << "Failed to delete LeveldbValueStore database at " <<
         db_path_.value();
+    return false;
   }
+  return true;
 }
 
 scoped_ptr<ValueStore::Error> LeveldbValueStore::ToValueStoreError(
diff --git a/extensions/browser/value_store/leveldb_value_store.h b/extensions/browser/value_store/leveldb_value_store.h
index e7637142..d486283 100644
--- a/extensions/browser/value_store/leveldb_value_store.h
+++ b/extensions/browser/value_store/leveldb_value_store.h
@@ -92,7 +92,7 @@
 
   // Removes the on-disk database at |db_path_|. Any file system locks should
   // be released before calling this method.
-  void DeleteDbFile();
+  bool DeleteDbFile();
 
   // Returns whether the database is empty.
   bool IsEmpty();
@@ -103,6 +103,7 @@
   // leveldb backend.
   scoped_ptr<leveldb::DB> db_;
   base::HistogramBase* open_histogram_;
+  base::HistogramBase* restore_histogram_;
 
   DISALLOW_COPY_AND_ASSIGN(LeveldbValueStore);
 };
diff --git a/extensions/common/api/bluetooth.idl b/extensions/common/api/bluetooth.idl
index 134c0474..b110c48 100644
--- a/extensions/common/api/bluetooth.idl
+++ b/extensions/common/api/bluetooth.idl
@@ -66,6 +66,12 @@
     // Indicates whether the device is currently connected to the system.
     boolean? connected;
 
+    // Indicates whether the device is currently connecting to the system.
+    boolean? connecting;
+
+    // Indicates whether the device is connectable.
+    boolean? connectable;
+
     // UUIDs of protocols, profiles and services advertised by the device.
     // For classic Bluetooth devices, this list is obtained from EIR data and
     // SDP tables. For Low Energy devices, this list is obtained from AD and
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index a1c4afb6..141b2b2 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -127,6 +127,7 @@
     "command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc",
     "command_buffer/tests/gl_cube_map_texture_unittest.cc",
     "command_buffer/tests/gl_depth_texture_unittest.cc",
+    "command_buffer/tests/gl_ext_srgb_unittest.cc",
     "command_buffer/tests/gl_fence_sync_unittest.cc",
     "command_buffer/tests/gl_gpu_memory_buffer_unittest.cc",
     "command_buffer/tests/gl_lose_context_chromium_unittest.cc",
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 4e5aefe4..5a548d0e 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -501,9 +501,10 @@
   // sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid
   // <format> in this case. So, even with GLES3 explicitly check for
   // GL_EXT_sRGB.
-  if (((gl_version_info_->is_es3 ||
-        extensions.Contains("GL_OES_rgb8_rgba8")) &&
-      extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures()) {
+  if (!workarounds_.disable_ext_srgb &&
+      (((gl_version_info_->is_es3 ||
+         extensions.Contains("GL_OES_rgb8_rgba8")) &&
+        extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures())) {
     AddExtensionString("GL_EXT_sRGB");
     validators_.texture_internal_format.AddValue(GL_SRGB_EXT);
     validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 39e0a29..f25c65f0 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -190,33 +190,6 @@
   GLfloat v[4];
 };
 
-// Returns the union of |rect1| and |rect2| if one of the rectangles is empty,
-// contains the other rectangle or shares an edge with the other rectangle.
-bool CombineAdjacentRects(const gfx::Rect& rect1,
-                          const gfx::Rect& rect2,
-                          gfx::Rect* result) {
-  // Return |rect2| if |rect1| is empty or |rect2| contains |rect1|.
-  if (rect1.IsEmpty() || rect2.Contains(rect1)) {
-    *result = rect2;
-    return true;
-  }
-
-  // Return |rect1| if |rect2| is empty or |rect1| contains |rect2|.
-  if (rect2.IsEmpty() || rect1.Contains(rect2)) {
-    *result = rect1;
-    return true;
-  }
-
-  // Return the union of |rect1| and |rect2| if they share an edge.
-  if (rect1.SharesEdgeWith(rect2)) {
-    *result = gfx::UnionRects(rect1, rect2);
-    return true;
-  }
-
-  // Return false if it's not possible to combine |rect1| and |rect2|.
-  return false;
-}
-
 GLenum ExtractFormatFromStorageFormat(GLenum internalformat) {
   switch (internalformat) {
     case GL_R8:
@@ -11109,9 +11082,9 @@
   if (xoffset != 0 || yoffset != 0 || width != size.width() ||
       height != size.height()) {
     gfx::Rect cleared_rect;
-    if (CombineAdjacentRects(texture->GetLevelClearedRect(target, level),
-                             gfx::Rect(xoffset, yoffset, width, height),
-                             &cleared_rect)) {
+    if (TextureManager::CombineAdjacentRects(
+            texture->GetLevelClearedRect(target, level),
+            gfx::Rect(xoffset, yoffset, width, height), &cleared_rect)) {
       DCHECK_GE(cleared_rect.size().GetArea(),
                 texture->GetLevelClearedRect(target, level).size().GetArea());
       texture_manager()->SetLevelClearedRect(texture_ref, target, level,
@@ -11165,149 +11138,6 @@
   ExitCommandProcessingEarly();
 }
 
-bool GLES2DecoderImpl::ValidateTexSubImage2D(
-    error::Error* error,
-    const char* function_name,
-    GLenum target,
-    GLint level,
-    GLint xoffset,
-    GLint yoffset,
-    GLsizei width,
-    GLsizei height,
-    GLenum format,
-    GLenum type,
-    const void * data) {
-  (*error) = error::kNoError;
-  if (!validators_->texture_target.IsValid(target)) {
-    LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, target, "target");
-    return false;
-  }
-  if (width < 0) {
-    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "width < 0");
-    return false;
-  }
-  if (height < 0) {
-    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "height < 0");
-    return false;
-  }
-  TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
-      &state_, target);
-  if (!texture_ref) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        function_name, "unknown texture for target");
-    return false;
-  }
-  Texture* texture = texture_ref->texture();
-  GLenum current_type = 0;
-  GLenum internal_format = 0;
-  if (!texture->GetLevelType(target, level, &current_type, &internal_format)) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION, function_name, "level does not exist.");
-    return false;
-  }
-  if (!texture_manager()->ValidateTextureParameters(state_.GetErrorState(),
-      function_name, format, type, internal_format, level)) {
-    return false;
-  }
-  if (type != current_type && !feature_info_->IsES3Enabled()) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        function_name, "type does not match type of texture.");
-    return false;
-  }
-  if (!texture->ValidForTexture(
-          target, level, xoffset, yoffset, 0, width, height, 1)) {
-    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "bad dimensions.");
-    return false;
-  }
-  if ((GLES2Util::GetChannelsForFormat(format) &
-       (GLES2Util::kDepth | GLES2Util::kStencil)) != 0
-      && !feature_info_->IsES3Enabled()) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        function_name, "can not supply data for depth or stencil textures");
-    return false;
-  }
-  if (data == NULL) {
-    (*error) = error::kOutOfBounds;
-    return false;
-  }
-  return true;
-}
-
-error::Error GLES2DecoderImpl::DoTexSubImage2D(
-    GLenum target,
-    GLint level,
-    GLint xoffset,
-    GLint yoffset,
-    GLsizei width,
-    GLsizei height,
-    GLenum format,
-    GLenum type,
-    const void * data) {
-  error::Error error = error::kNoError;
-  if (!ValidateTexSubImage2D(&error, "glTexSubImage2D", target, level,
-      xoffset, yoffset, width, height, format, type, data)) {
-    return error;
-  }
-  TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
-      &state_, target);
-  Texture* texture = texture_ref->texture();
-  GLsizei tex_width = 0;
-  GLsizei tex_height = 0;
-  bool ok = texture->GetLevelSize(
-      target, level, &tex_width, &tex_height, nullptr);
-  DCHECK(ok);
-  if (xoffset != 0 || yoffset != 0 ||
-      width != tex_width || height != tex_height) {
-    gfx::Rect cleared_rect;
-    if (CombineAdjacentRects(texture->GetLevelClearedRect(target, level),
-                             gfx::Rect(xoffset, yoffset, width, height),
-                             &cleared_rect)) {
-      DCHECK_GE(cleared_rect.size().GetArea(),
-                texture->GetLevelClearedRect(target, level).size().GetArea());
-      texture_manager()->SetLevelClearedRect(texture_ref, target, level,
-                                             cleared_rect);
-    } else {
-      // Otherwise clear part of texture level that is not already cleared.
-      if (!texture_manager()->ClearTextureLevel(this, texture_ref, target,
-                                                level)) {
-        LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glTexSubImage2D",
-                           "dimensions too big");
-        return error::kNoError;
-      }
-    }
-    ScopedTextureUploadTimer timer(&texture_state_);
-    glTexSubImage2D(
-        target, level, xoffset, yoffset, width, height, format, type, data);
-    return error::kNoError;
-  }
-
-  if (!texture_state_.texsubimage_faster_than_teximage &&
-      !texture->IsImmutable() &&
-      !texture->HasImages()) {
-    ScopedTextureUploadTimer timer(&texture_state_);
-    GLenum internal_format;
-    GLenum tex_type;
-    texture->GetLevelType(target, level, &tex_type, &internal_format);
-    // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need
-    // to look it up.
-    glTexImage2D(
-        target, level, internal_format, width, height, 0, format, type, data);
-  } else {
-    ScopedTextureUploadTimer timer(&texture_state_);
-    glTexSubImage2D(
-        target, level, xoffset, yoffset, width, height, format, type, data);
-  }
-  texture_manager()->SetLevelCleared(texture_ref, target, level, true);
-
-  // This may be a slow command.  Exit command processing to allow for
-  // context preemption and GPU watchdog checks.
-  ExitCommandProcessingEarly();
-  return error::kNoError;
-}
-
 error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32 immediate_data_size,
                                                    const void* cmd_data) {
   const gles2::cmds::TexSubImage2D& c =
@@ -11332,10 +11162,23 @@
       NULL, NULL)) {
     return error::kOutOfBounds;
   }
+
   const void* pixels = GetSharedMemoryAs<const void*>(
       c.pixels_shm_id, c.pixels_shm_offset, data_size);
-  return DoTexSubImage2D(
-      target, level, xoffset, yoffset, width, height, format, type, pixels);
+  if (!pixels)
+    return error::kOutOfBounds;
+
+  TextureManager::DoTexSubImageArguments args = {
+      target, level,  xoffset, yoffset, width,
+      height, format, type,    pixels,  data_size};
+  texture_manager()->ValidateAndDoTexSubImage(this, &texture_state_, &state_,
+                                              &framebuffer_state_,
+                                              "glTexSubImage2D", args);
+
+  // This may be a slow command.  Exit command processing to allow for
+  // context preemption and GPU watchdog checks.
+  ExitCommandProcessingEarly();
+  return error::kNoError;
 }
 
 error::Error GLES2DecoderImpl::DoTexSubImage3D(
@@ -13273,9 +13116,9 @@
   if (xoffset != 0 || yoffset != 0 || width != dest_width ||
       height != dest_height) {
     gfx::Rect cleared_rect;
-    if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0),
-                             gfx::Rect(xoffset, yoffset, width, height),
-                             &cleared_rect)) {
+    if (TextureManager::CombineAdjacentRects(
+            dest_texture->GetLevelClearedRect(target, 0),
+            gfx::Rect(xoffset, yoffset, width, height), &cleared_rect)) {
       DCHECK_GE(cleared_rect.size().GetArea(),
                 dest_texture->GetLevelClearedRect(target, 0).size().GetArea());
       texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0,
@@ -13611,9 +13454,9 @@
   if (xoffset != 0 || yoffset != 0 || width != dest_width ||
       height != dest_height) {
     gfx::Rect cleared_rect;
-    if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0),
-                             gfx::Rect(xoffset, yoffset, width, height),
-                             &cleared_rect)) {
+    if (TextureManager::CombineAdjacentRects(
+            dest_texture->GetLevelClearedRect(target, 0),
+            gfx::Rect(xoffset, yoffset, width, height), &cleared_rect)) {
       DCHECK_GE(cleared_rect.size().GetArea(),
                 dest_texture->GetLevelClearedRect(target, 0).size().GetArea());
       texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
index 2f119b71..7c7cf7c9 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
@@ -219,8 +219,8 @@
 }
 
 TEST_P(GLES2DecoderTest, TexSubImage2DBadArgs) {
-  const int kWidth = 16;
-  const int kHeight = 8;
+  const int kWidth = 8;
+  const int kHeight = 4;
   DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
   DoTexImage2D(GL_TEXTURE_2D,
                1,
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index 4f856d6..bd93329f 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -22,6 +22,7 @@
 #include "gpu/command_buffer/service/mailbox_manager.h"
 #include "gpu/command_buffer/service/memory_tracking.h"
 #include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_version_info.h"
 #include "ui/gl/trace_util.h"
 
 namespace gpu {
@@ -2002,6 +2003,138 @@
              function_name, texture_ref, args);
 }
 
+bool TextureManager::ValidateTexSubImage(ContextState* state,
+                                         const char* function_name,
+                                         const DoTexSubImageArguments& args,
+                                         TextureRef** texture_ref) {
+  ErrorState* error_state = state->GetErrorState();
+  const Validators* validators = feature_info_->validators();
+
+  if (!validators->texture_target.IsValid(args.target)) {
+    ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(error_state, function_name,
+                                         args.target, "target");
+    return false;
+  }
+  if (args.width < 0) {
+    ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_VALUE, function_name,
+                            "width < 0");
+    return false;
+  }
+  if (args.height < 0) {
+    ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_VALUE, function_name,
+                            "height < 0");
+    return false;
+  }
+  TextureRef* local_texture_ref = GetTextureInfoForTarget(state, args.target);
+  if (!local_texture_ref) {
+    ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, function_name,
+                            "unknown texture for target");
+    return false;
+  }
+  Texture* texture = local_texture_ref->texture();
+  GLenum current_type = 0;
+  GLenum internal_format = 0;
+  if (!texture->GetLevelType(args.target, args.level, &current_type,
+                             &internal_format)) {
+    ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, function_name,
+                            "level does not exist.");
+    return false;
+  }
+  if (!ValidateTextureParameters(error_state, function_name, args.format,
+                                 args.type, internal_format, args.level)) {
+    return false;
+  }
+  if (args.type != current_type && !feature_info_->IsES3Enabled()) {
+    ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, function_name,
+                            "type does not match type of texture.");
+    return false;
+  }
+  if (!texture->ValidForTexture(args.target, args.level, args.xoffset,
+                                args.yoffset, 0, args.width, args.height, 1)) {
+    ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_VALUE, function_name,
+                            "bad dimensions.");
+    return false;
+  }
+  if ((GLES2Util::GetChannelsForFormat(args.format) &
+       (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 &&
+      !feature_info_->IsES3Enabled()) {
+    ERRORSTATE_SET_GL_ERROR(
+        error_state, GL_INVALID_OPERATION, function_name,
+        "can not supply data for depth or stencil textures");
+    return false;
+  }
+  DCHECK(args.pixels);
+  *texture_ref = local_texture_ref;
+  return true;
+}
+
+void TextureManager::ValidateAndDoTexSubImage(
+    GLES2Decoder* decoder,
+    DecoderTextureState* texture_state,
+    ContextState* state,
+    DecoderFramebufferState* framebuffer_state,
+    const char* function_name,
+    const DoTexSubImageArguments& args) {
+  ErrorState* error_state = state->GetErrorState();
+  TextureRef* texture_ref;
+  if (!ValidateTexSubImage(state, function_name, args, &texture_ref)) {
+    return;
+  }
+
+  Texture* texture = texture_ref->texture();
+  GLsizei tex_width = 0;
+  GLsizei tex_height = 0;
+  bool ok = texture->GetLevelSize(args.target, args.level, &tex_width,
+                                  &tex_height, nullptr);
+  DCHECK(ok);
+  if (args.xoffset != 0 || args.yoffset != 0 || args.width != tex_width ||
+      args.height != tex_height) {
+    gfx::Rect cleared_rect;
+    if (CombineAdjacentRects(
+            texture->GetLevelClearedRect(args.target, args.level),
+            gfx::Rect(args.xoffset, args.yoffset, args.width, args.height),
+            &cleared_rect)) {
+      DCHECK_GE(cleared_rect.size().GetArea(),
+                texture->GetLevelClearedRect(args.target, args.level)
+                    .size()
+                    .GetArea());
+      SetLevelClearedRect(texture_ref, args.target, args.level, cleared_rect);
+    } else {
+      // Otherwise clear part of texture level that is not already cleared.
+      if (!ClearTextureLevel(decoder, texture_ref, args.target, args.level)) {
+        ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY,
+                                "glTexSubImage2D", "dimensions too big");
+        return;
+      }
+    }
+    ScopedTextureUploadTimer timer(texture_state);
+    glTexSubImage2D(args.target, args.level, args.xoffset, args.yoffset,
+                    args.width, args.height, AdjustTexFormat(args.format),
+                    args.type, args.pixels);
+    return;
+  }
+
+  if (!texture_state->texsubimage_faster_than_teximage &&
+      !texture->IsImmutable() && !texture->HasImages()) {
+    ScopedTextureUploadTimer timer(texture_state);
+    GLenum internal_format;
+    GLenum tex_type;
+    texture->GetLevelType(args.target, args.level, &tex_type, &internal_format);
+    // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need
+    // to look it up.
+    glTexImage2D(args.target, args.level, internal_format, args.width,
+                 args.height, 0, AdjustTexFormat(args.format), args.type,
+                 args.pixels);
+  } else {
+    ScopedTextureUploadTimer timer(texture_state);
+    glTexSubImage2D(args.target, args.level, args.xoffset, args.yoffset,
+                    args.width, args.height, AdjustTexFormat(args.format),
+                    args.type, args.pixels);
+  }
+  SetLevelCleared(texture_ref, args.target, args.level, true);
+  return;
+}
+
 GLenum TextureManager::AdjustTexFormat(GLenum format) const {
   // TODO(bajones): GLES 3 allows for internal format and format to differ.
   // This logic may need to change as a result.
@@ -2089,6 +2222,31 @@
   }
 }
 
+bool TextureManager::CombineAdjacentRects(const gfx::Rect& rect1,
+                                          const gfx::Rect& rect2,
+                                          gfx::Rect* result) {
+  // Return |rect2| if |rect1| is empty or |rect2| contains |rect1|.
+  if (rect1.IsEmpty() || rect2.Contains(rect1)) {
+    *result = rect2;
+    return true;
+  }
+
+  // Return |rect1| if |rect2| is empty or |rect1| contains |rect2|.
+  if (rect2.IsEmpty() || rect1.Contains(rect2)) {
+    *result = rect1;
+    return true;
+  }
+
+  // Return the union of |rect1| and |rect2| if they share an edge.
+  if (rect1.SharesEdgeWith(rect2)) {
+    *result = gfx::UnionRects(rect1, rect2);
+    return true;
+  }
+
+  // Return false if it's not possible to combine |rect1| and |rect2|.
+  return false;
+}
+
 ScopedTextureUploadTimer::ScopedTextureUploadTimer(
     DecoderTextureState* texture_state)
     : texture_state_(texture_state),
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h
index ec0d548d9..85ad7e0 100644
--- a/gpu/command_buffer/service/texture_manager.h
+++ b/gpu/command_buffer/service/texture_manager.h
@@ -868,6 +868,35 @@
     const char* function_name,
     const DoTexImageArguments& args);
 
+  struct DoTexSubImageArguments {
+    GLenum target;
+    GLint level;
+    GLint xoffset;
+    GLint yoffset;
+    GLsizei width;
+    GLsizei height;
+    GLenum format;
+    GLenum type;
+    const void* pixels;
+    uint32 pixels_size;
+    // TODO(kkinnunen): currently this is used only for TexSubImage2D.
+  };
+
+  bool ValidateTexSubImage(
+      ContextState* state,
+      const char* function_name,
+      const DoTexSubImageArguments& args,
+      // Pointer to TextureRef filled in if validation successful.
+      // Presumes the pointer is valid.
+      TextureRef** texture_ref);
+
+  void ValidateAndDoTexSubImage(GLES2Decoder* decoder,
+                                DecoderTextureState* texture_state,
+                                ContextState* state,
+                                DecoderFramebufferState* framebuffer_state,
+                                const char* function_name,
+                                const DoTexSubImageArguments& args);
+
   // TODO(kloveless): Make GetTexture* private once this is no longer called
   // from gles2_cmd_decoder.
   TextureRef* GetTextureInfoForTarget(ContextState* state, GLenum target);
@@ -884,6 +913,14 @@
   bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
                     base::trace_event::ProcessMemoryDump* pmd) override;
 
+  // Returns the union of |rect1| and |rect2| if one of the rectangles is empty,
+  // contains the other rectangle or shares an edge with the other rectangle.
+  // Part of the public interface because texture pixel data rectangle
+  // operations are also implemented in decoder at the moment.
+  static bool CombineAdjacentRects(const gfx::Rect& rect1,
+                                   const gfx::Rect& rect2,
+                                   gfx::Rect* result);
+
  private:
   friend class Texture;
   friend class TextureRef;
diff --git a/gpu/command_buffer/tests/gl_ext_srgb_unittest.cc b/gpu/command_buffer/tests/gl_ext_srgb_unittest.cc
new file mode 100644
index 0000000..53b3c24f
--- /dev/null
+++ b/gpu/command_buffer/tests/gl_ext_srgb_unittest.cc
@@ -0,0 +1,74 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include "gpu/command_buffer/tests/gl_manager.h"
+#include "gpu/command_buffer/tests/gl_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace gpu {
+
+// A collection of tests that exercise the GL_EXT_srgb extension.
+class GLEXTSRGBTest : public testing::Test {
+ protected:
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
+  void TearDown() override { gl_.Destroy(); }
+  bool IsApplicable() const {
+    return GLTestHelper::HasExtension("GL_EXT_sRGB");
+  }
+  GLManager gl_;
+};
+
+// Test to ensure that GL_SRGB_ALPHA as glTex(Sub)Image2D parameter works. This
+// is tricky because GL_SRGB_ALPHA is valid in OpenGL ES 2.0 but not valid in
+// OpenGL.
+TEST_F(GLEXTSRGBTest, TexImageSRGBALPHAFormat) {
+  if (!IsApplicable())
+    return;
+  static const int kWidth = 10;
+  static const int kHeight = 10;
+  static const int kSubImageX = kWidth / 2;
+  static const int kSubImageY = kHeight / 2;
+  static const int kSubImageWidth = kWidth / 2;
+  static const int kSubImageHeight = kHeight / 2;
+  static const uint8 kImageColor[] = {255, 255, 255, 255};
+  static const uint8 kSubImageColor[] = {128, 128, 128, 128};
+
+  uint8 pixels[kWidth * kHeight * 4];
+
+  GLuint tex = 0;
+  glGenTextures(1, &tex);
+  glBindTexture(GL_TEXTURE_2D, tex);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+  memset(pixels, kImageColor[0], sizeof(pixels));
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, kWidth, kHeight, 0,
+               GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, pixels);
+  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
+
+  memset(pixels, kSubImageColor[0], sizeof(pixels));
+  glTexSubImage2D(GL_TEXTURE_2D, 0, kSubImageX, kSubImageY, kSubImageWidth,
+                  kSubImageHeight, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, pixels);
+  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
+  glBindTexture(GL_TEXTURE_2D, 0);
+  GLuint fbo = 0;
+  glGenFramebuffers(1, &fbo);
+  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                         tex, 0);
+  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
+            glCheckFramebufferStatus(GL_FRAMEBUFFER));
+
+  GLTestHelper::CheckPixels(0, 0, kSubImageX, kHeight, 0, kImageColor);
+  GLTestHelper::CheckPixels(0, 0, kWidth, kSubImageY, 0, kImageColor);
+  GLTestHelper::CheckPixels(kSubImageX, kSubImageY, kSubImageWidth,
+                            kSubImageHeight, 0, kSubImageColor);
+}
+
+}  // namespace gpu
diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc
index e1a4d3ce..e91ada8 100644
--- a/gpu/config/gpu_driver_bug_list_json.cc
+++ b/gpu/config/gpu_driver_bug_list_json.cc
@@ -19,7 +19,7 @@
 {
   "name": "gpu driver bug list",
   // Please update the version number whenever you change this file.
-  "version": "8.30",
+  "version": "8.32",
   "entries": [
     {
       "id": 1,
@@ -1566,6 +1566,36 @@
       "features": [
         "max_copy_texture_chromium_size_1048576"
       ]
+    },
+    {
+      "id": 134,
+      "description": "glReadPixels fails on FBOs with SRGB_ALPHA textures",
+      "cr_bugs": [550292],
+      "os": {
+        "type": "android",
+        "version": {
+          "op": "<",
+          "value": "5.0"
+        }
+      },
+      "gl_vendor": "Qualcomm.*",
+      "features": [
+        "disable_ext_srgb"
+      ]
+    },
+    {
+      "id": 135,
+      "description": "Screen flickers on 2009 iMacs",
+      "cr_bugs": [543324],
+      "os": {
+        "type": "macosx"
+      },
+      "vendor_id": "0x1002",
+      "device_id": ["0x9440", "0x944a"],
+      "features": [
+        "disable_overlay_ca_layers",
+        "disable_post_sub_buffers_for_onscreen_surfaces"
+      ]
     }
   ]
 }
diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h
index 9bbbb73..88d3ffb 100644
--- a/gpu/config/gpu_driver_bug_workaround_type.h
+++ b/gpu/config/gpu_driver_bug_workaround_type.h
@@ -34,6 +34,8 @@
          disable_discard_framebuffer)                        \
   GPU_OP(DISABLE_EXT_DRAW_BUFFERS,                           \
          disable_ext_draw_buffers)                           \
+  GPU_OP(DISABLE_EXT_SRGB,                                   \
+         disable_ext_srgb)                                   \
   GPU_OP(DISABLE_GL_PATH_RENDERING,                          \
          disable_gl_path_rendering)                          \
   GPU_OP(DISABLE_GL_RGB_FORMAT,                              \
@@ -44,6 +46,8 @@
          disable_multimonitor_multisampling)                 \
   GPU_OP(DISABLE_MULTISAMPLED_RENDER_TO_TEXTURE,             \
          disable_multisampled_render_to_texture)             \
+  GPU_OP(DISABLE_OVERLAY_CA_LAYERS,                          \
+         disable_overlay_ca_layers)                          \
   GPU_OP(DISABLE_POST_SUB_BUFFERS_FOR_ONSCREEN_SURFACES,     \
          disable_post_sub_buffers_for_onscreen_surfaces)     \
   GPU_OP(DISABLE_PROGRAM_CACHE,                              \
diff --git a/gpu/config/software_rendering_list_json.cc b/gpu/config/software_rendering_list_json.cc
index b890a38..3a8b0709 100644
--- a/gpu/config/software_rendering_list_json.cc
+++ b/gpu/config/software_rendering_list_json.cc
@@ -18,7 +18,7 @@
 {
   "name": "software rendering list",
   // Please update the version number whenever you change this file.
-  "version": "10.14",
+  "version": "10.15",
   "entries": [
     {
       "id": 1,
@@ -1172,19 +1172,6 @@
       "features": [
         "all"
       ]
-    },
-    {
-      "id": 108,
-      "description": "Screen flickers on 2009 iMacs",
-      "cr_bugs": [543324],
-      "os": {
-        "type": "macosx"
-      },
-      "vendor_id": "0x1002",
-      "device_id": ["0x944a"],
-      "features": [
-        "all"
-      ]
     }
   ]
 }
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index 7a11c3cf..d543c56 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -367,6 +367,7 @@
         'command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc',
         'command_buffer/tests/gl_cube_map_texture_unittest.cc',
         'command_buffer/tests/gl_depth_texture_unittest.cc',
+        'command_buffer/tests/gl_ext_srgb_unittest.cc',
         'command_buffer/tests/gl_fence_sync_unittest.cc',
         'command_buffer/tests/gl_gpu_memory_buffer_unittest.cc',
         'command_buffer/tests/gl_lose_context_chromium_unittest.cc',
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg
index cb649fed..01674866 100644
--- a/infra/config/cq.cfg
+++ b/infra/config/cq.cfg
@@ -40,7 +40,6 @@
       builders { name: "chromeos_x86-generic_chromium_compile_only_ng" }
       builders { name: "chromium_presubmit" }
       builders { name: "linux_android_rel_ng" }
-      builders { name: "linux_blink_oilpan_rel" }
       builders { name: "linux_chromium_asan_rel_ng" }
       builders { name: "linux_chromium_chromeos_compile_dbg_ng" }
       builders { name: "linux_chromium_chromeos_ozone_rel_ng" }
@@ -51,6 +50,10 @@
       builders { name: "linux_chromium_gn_chromeos_rel" }
       builders { name: "linux_chromium_rel_ng" }
       builders {
+        name: "linux_blink_oilpan_rel"
+        experiment_percentage: 50
+      }
+      builders {
         name: "linux_chromium_chromeos_asan_rel_ng"
         experiment_percentage: 10
       }
diff --git a/ios/chrome/browser/history/history_client_impl.cc b/ios/chrome/browser/history/history_client_impl.cc
index 9a3f42f..780a59d 100644
--- a/ios/chrome/browser/history/history_client_impl.cc
+++ b/ios/chrome/browser/history/history_client_impl.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/location.h"
 #include "base/logging.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/history/core/browser/history_service.h"
@@ -63,12 +62,6 @@
 void HistoryClientImpl::NotifyProfileError(sql::InitStatus init_status) {
 }
 
-void HistoryClientImpl::PostAfterStartupTask(
-    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-    const base::Closure& task) {
-  task_runner->PostTask(FROM_HERE, task);
-}
-
 scoped_ptr<history::HistoryBackendClient>
 HistoryClientImpl::CreateBackendClient() {
   return make_scoped_ptr(new HistoryBackendClientImpl(bookmark_model_));
diff --git a/ios/chrome/browser/history/history_client_impl.h b/ios/chrome/browser/history/history_client_impl.h
index 5fa9891..abcfff3 100644
--- a/ios/chrome/browser/history/history_client_impl.h
+++ b/ios/chrome/browser/history/history_client_impl.h
@@ -34,9 +34,6 @@
   void Shutdown() override;
   bool CanAddURL(const GURL& url) override;
   void NotifyProfileError(sql::InitStatus init_status) override;
-  void PostAfterStartupTask(
-      const scoped_refptr<base::SequencedTaskRunner>& task_runner,
-      const base::Closure& task) override;
   scoped_ptr<history::HistoryBackendClient> CreateBackendClient() override;
 
   // bookmarks::BaseBookmarkModelObserver implementation.
diff --git a/ios/web/webui/url_data_manager_ios_backend.cc b/ios/web/webui/url_data_manager_ios_backend.cc
index d5117c2..cc3e3e9 100644
--- a/ios/web/webui/url_data_manager_ios_backend.cc
+++ b/ios/web/webui/url_data_manager_ios_backend.cc
@@ -96,7 +96,7 @@
   // net::URLRequestJob implementation.
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetMimeType(std::string* mime_type) const override;
   int GetResponseCode() const override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
@@ -142,7 +142,7 @@
 
   // Do the actual copy from data_ (the data we're serving) into |buf|.
   // Separate from ReadRawData so we can handle async I/O.
-  int CompleteRead(net::IOBuffer* buf, int buf_size);
+  void CompleteRead(net::IOBuffer* buf, int buf_size, int* bytes_read);
 
   // The actual data we're serving.  NULL until it's been fetched.
   scoped_refptr<base::RefCountedMemory> data_;
@@ -291,46 +291,58 @@
 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) {
   TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this);
   if (bytes) {
+    // The request completed, and we have all the data.
+    // Clear any IO pending status.
+    SetStatus(net::URLRequestStatus());
+
     data_ = bytes;
+    int bytes_read;
     if (pending_buf_.get()) {
       CHECK(pending_buf_->data());
-      int rv = CompleteRead(pending_buf_.get(), pending_buf_size_);
+      CompleteRead(pending_buf_.get(), pending_buf_size_, &bytes_read);
       pending_buf_ = NULL;
-      ReadRawDataComplete(rv);
+      NotifyReadComplete(bytes_read);
     }
   } else {
-    ReadRawDataComplete(net::ERR_FAILED);
+    // The request failed.
+    NotifyDone(
+        net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED));
   }
 }
 
-int URLRequestChromeJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
+bool URLRequestChromeJob::ReadRawData(net::IOBuffer* buf,
+                                      int buf_size,
+                                      int* bytes_read) {
   if (!data_.get()) {
+    SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
     DCHECK(!pending_buf_.get());
     CHECK(buf->data());
     pending_buf_ = buf;
     pending_buf_size_ = buf_size;
-    return net::ERR_IO_PENDING;  // Tell the caller we're still waiting for
-                                 // data.
+    return false;  // Tell the caller we're still waiting for data.
   }
 
   // Otherwise, the data is available.
-  return CompleteRead(buf, buf_size);
+  CompleteRead(buf, buf_size, bytes_read);
+  return true;
 }
 
-int URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size) {
+void URLRequestChromeJob::CompleteRead(net::IOBuffer* buf,
+                                       int buf_size,
+                                       int* bytes_read) {
   // http://crbug.com/373841
   char url_buf[128];
   base::strlcpy(url_buf, request_->url().spec().c_str(), arraysize(url_buf));
   base::debug::Alias(url_buf);
 
-  int remaining = data_->size() - data_offset_;
+  int remaining = static_cast<int>(data_->size()) - data_offset_;
   if (buf_size > remaining)
     buf_size = remaining;
   if (buf_size > 0) {
     memcpy(buf->data(), data_->front() + data_offset_, buf_size);
     data_offset_ += buf_size;
   }
-  return buf_size;
+  *bytes_read = buf_size;
 }
 
 namespace {
diff --git a/mandoline/ui/desktop_ui/browser_window.cc b/mandoline/ui/desktop_ui/browser_window.cc
index 4b4e698..5a9dcaf 100644
--- a/mandoline/ui/desktop_ui/browser_window.cc
+++ b/mandoline/ui/desktop_ui/browser_window.cc
@@ -90,7 +90,7 @@
   mus::mojom::WindowTreeHostClientPtr host_client;
   host_client_binding_.Bind(GetProxy(&host_client));
   mus::CreateWindowTreeHost(host_factory, host_client.Pass(), this, &host_,
-                            nullptr);
+                            nullptr, nullptr);
 }
 
 void BrowserWindow::LoadURL(const GURL& url) {
diff --git a/mandoline/ui/phone_ui/phone_browser_application_delegate.cc b/mandoline/ui/phone_ui/phone_browser_application_delegate.cc
index d6f40fb..b9fa5e9 100644
--- a/mandoline/ui/phone_ui/phone_browser_application_delegate.cc
+++ b/mandoline/ui/phone_ui/phone_browser_application_delegate.cc
@@ -47,7 +47,7 @@
       break;
     }
   }
-  mus::CreateSingleWindowTreeHost(app_, this, &host_, nullptr);
+  mus::CreateSingleWindowTreeHost(app_, this, &host_, nullptr, nullptr);
 }
 
 bool PhoneBrowserApplicationDelegate::ConfigureIncomingConnection(
diff --git a/media/audio/audio_output_stream_sink.cc b/media/audio/audio_output_stream_sink.cc
index cd08fdd3..ceb943fc 100644
--- a/media/audio/audio_output_stream_sink.cc
+++ b/media/audio/audio_output_stream_sink.cc
@@ -12,11 +12,12 @@
 namespace media {
 
 AudioOutputStreamSink::AudioOutputStreamSink()
-    : render_callback_(NULL),
+    : initialized_(false),
+      started_(false),
+      render_callback_(NULL),
+      active_render_callback_(NULL),
       audio_task_runner_(AudioManager::Get()->GetTaskRunner()),
-      stream_(NULL),
-      active_render_callback_(NULL) {
-}
+      stream_(NULL) {}
 
 AudioOutputStreamSink::~AudioOutputStreamSink() {
 }
@@ -24,18 +25,27 @@
 void AudioOutputStreamSink::Initialize(const AudioParameters& params,
                                        RenderCallback* callback) {
   DCHECK(callback);
-  DCHECK(!render_callback_);
+  DCHECK(!started_);
   params_ = params;
   render_callback_ = callback;
+  initialized_ = true;
 }
 
 void AudioOutputStreamSink::Start() {
+  DCHECK(initialized_);
+  DCHECK(!started_);
+  {
+    base::AutoLock al(callback_lock_);
+    active_render_callback_ = render_callback_;
+  }
+  started_ = true;
   audio_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&AudioOutputStreamSink::DoStart, this));
+      FROM_HERE, base::Bind(&AudioOutputStreamSink::DoStart, this, params_));
 }
 
 void AudioOutputStreamSink::Stop() {
   ClearCallback();
+  started_ = false;
   audio_task_runner_->PostTask(
       FROM_HERE, base::Bind(&AudioOutputStreamSink::DoStop, this));
 }
@@ -47,8 +57,10 @@
 }
 
 void AudioOutputStreamSink::Play() {
-  base::AutoLock al(callback_lock_);
-  active_render_callback_ = render_callback_;
+  {
+    base::AutoLock al(callback_lock_);
+    active_render_callback_ = render_callback_;
+  }
   audio_task_runner_->PostTask(
       FROM_HERE, base::Bind(&AudioOutputStreamSink::DoPlay, this));
 }
@@ -71,7 +83,7 @@
     return 0;
 
   return active_render_callback_->Render(
-      dest, total_bytes_delay * 1000.0 / params_.GetBytesPerSecond());
+      dest, total_bytes_delay * 1000.0 / active_params_.GetBytesPerSecond());
 }
 
 void AudioOutputStreamSink::OnError(AudioOutputStream* stream) {
@@ -81,15 +93,20 @@
     active_render_callback_->OnRenderError();
 }
 
-void AudioOutputStreamSink::DoStart() {
+void AudioOutputStreamSink::DoStart(const AudioParameters& params) {
   DCHECK(audio_task_runner_->BelongsToCurrentThread());
 
   // Create an AudioOutputStreamProxy which will handle any and all resampling
   // necessary to generate a low latency output stream.
-  stream_ =
-      AudioManager::Get()->MakeAudioOutputStreamProxy(params_, std::string());
+  active_params_ = params;
+  stream_ = AudioManager::Get()->MakeAudioOutputStreamProxy(active_params_,
+                                                            std::string());
   if (!stream_ || !stream_->Open()) {
-    render_callback_->OnRenderError();
+    {
+      base::AutoLock al(callback_lock_);
+      if (active_render_callback_)
+        active_render_callback_->OnRenderError();
+    }
     if (stream_)
       stream_->Close();
     stream_ = NULL;
diff --git a/media/audio/audio_output_stream_sink.h b/media/audio/audio_output_stream_sink.h
index 6ab5dc1..1a5701b 100644
--- a/media/audio/audio_output_stream_sink.h
+++ b/media/audio/audio_output_stream_sink.h
@@ -23,12 +23,12 @@
 // TODO(dalecurtis): Delete this class once we have a proper mojo audio service;
 // tracked by http://crbug.com/425368
 class MEDIA_EXPORT AudioOutputStreamSink
-    : NON_EXPORTED_BASE(public AudioRendererSink),
+    : NON_EXPORTED_BASE(public RestartableAudioRendererSink),
       public AudioOutputStream::AudioSourceCallback {
  public:
   AudioOutputStreamSink();
 
-  // AudioRendererSink implementation.
+  // RestartableAudioRendererSink implementation.
   void Initialize(const AudioParameters& params,
                   RenderCallback* callback) override;
   void Start() override;
@@ -44,37 +44,39 @@
 
  private:
   ~AudioOutputStreamSink() override;
+  void ClearCallback();
 
   // Helper methods for running AudioManager methods on the audio thread.
-  void DoStart();
+  void DoStart(const AudioParameters& params);
   void DoStop();
   void DoPause();
   void DoPlay();
   void DoSetVolume(double volume);
 
-  // Clears |active_render_callback_| under lock, synchronously stopping render
-  // callbacks from any thread.  Must be called before Pause() and Stop()
-  // trampoline to their helper methods on the audio thread.
-  void ClearCallback();
+  bool initialized_;
+  bool started_;
 
-  // Parameters provided by Initialize(), cached for use on other threads.
+  // Parameters provided by Initialize().
   AudioParameters params_;
-
-  // Since Initialize() is only called once for AudioRenderSinks, save the
-  // callback both here and under |active_render_callback_| which will be
-  // cleared during Pause() and Stop() to achieve "synchronous" stoppage.
   RenderCallback* render_callback_;
 
+  // State latched for the audio thread.
+  // |active_render_callback_| allows Stop()/Pause() to synchronously prevent
+  // callbacks. Access is synchronized by |callback_lock_|.
+  // |active_params_| is set on the audio thread and therefore does not need
+  // synchronization.
+  AudioParameters active_params_;
+  RenderCallback* active_render_callback_;
+
+  // Lock to synchronize setting and clearing of |active_render_callback_|.
+  base::Lock callback_lock_;
+
   // The task runner for the audio thread.
   const scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
 
   // The actual AudioOutputStream, must only be accessed on the audio thread.
   AudioOutputStream* stream_;
 
-  // Lock and callback for forwarding OnMoreData() calls into Render() calls.
-  base::Lock callback_lock_;
-  RenderCallback* active_render_callback_;
-
   DISALLOW_COPY_AND_ASSIGN(AudioOutputStreamSink);
 };
 
diff --git a/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc
index 6341c690..0608da0 100644
--- a/media/audio/mac/audio_low_latency_input_mac.cc
+++ b/media/audio/mac/audio_low_latency_input_mac.cc
@@ -152,7 +152,6 @@
                                 &enableIO,  // enable
                                 sizeof(enableIO));
   if (result != noErr) {
-    CloseAudioUnit();
     HandleError(result);
     return false;
   }
@@ -166,7 +165,6 @@
                                 &enableIO,  // disable
                                 sizeof(enableIO));
   if (result != noErr) {
-    CloseAudioUnit();
     HandleError(result);
     return false;
   }
@@ -180,7 +178,6 @@
                                 &input_device_id_,
                                 sizeof(input_device_id_));
   if (result != noErr) {
-    CloseAudioUnit();
     HandleError(result);
     return false;
   }
@@ -195,7 +192,6 @@
                                 &format_,
                                 sizeof(format_));
   if (result != noErr) {
-    CloseAudioUnit();
     HandleError(result);
     return false;
   }
@@ -203,7 +199,6 @@
   if (!manager_->MaybeChangeBufferSize(input_device_id_, audio_unit_, 1,
                                        number_of_frames_,
                                        &buffer_size_was_changed_)) {
-    CloseAudioUnit();
     return false;
   }
   DLOG_IF(WARNING, buffer_size_was_changed_) << "IO buffer size was changed to "
@@ -222,7 +217,6 @@
                                 &callback,
                                 sizeof(callback));
   if (result != noErr) {
-    CloseAudioUnit();
     HandleError(result);
     return false;
   }
@@ -232,7 +226,6 @@
   // it can produce in response to a single render call.
   result = AudioUnitInitialize(audio_unit_);
   if (result != noErr) {
-    CloseAudioUnit();
     HandleError(result);
     return false;
   }
diff --git a/media/audio/null_audio_sink.cc b/media/audio/null_audio_sink.cc
index ba25718..5b043a0 100644
--- a/media/audio/null_audio_sink.cc
+++ b/media/audio/null_audio_sink.cc
@@ -15,16 +15,16 @@
 NullAudioSink::NullAudioSink(
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
     : initialized_(false),
+      started_(false),
       playing_(false),
       callback_(NULL),
-      task_runner_(task_runner) {
-}
+      task_runner_(task_runner) {}
 
 NullAudioSink::~NullAudioSink() {}
 
 void NullAudioSink::Initialize(const AudioParameters& params,
                                RenderCallback* callback) {
-  DCHECK(!initialized_);
+  DCHECK(!started_);
   fake_worker_.reset(new FakeAudioWorker(task_runner_, params));
   audio_bus_ = AudioBus::Create(params);
   callback_ = callback;
@@ -33,12 +33,14 @@
 
 void NullAudioSink::Start() {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(!playing_);
+  DCHECK(initialized_);
+  DCHECK(!started_);
+  started_ = true;
 }
 
 void NullAudioSink::Stop() {
   DCHECK(task_runner_->BelongsToCurrentThread());
-
+  started_ = false;
   // Stop may be called at any time, so we have to check before stopping.
   if (fake_worker_)
     fake_worker_->Stop();
@@ -46,18 +48,20 @@
 
 void NullAudioSink::Play() {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(initialized_);
+  DCHECK(started_);
 
   if (playing_)
     return;
 
   fake_worker_->Start(base::Bind(
       &NullAudioSink::CallRender, base::Unretained(this)));
+
   playing_ = true;
 }
 
 void NullAudioSink::Pause() {
   DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(started_);
 
   if (!playing_)
     return;
diff --git a/media/audio/null_audio_sink.h b/media/audio/null_audio_sink.h
index 85c7731a..9bfa518d2 100644
--- a/media/audio/null_audio_sink.h
+++ b/media/audio/null_audio_sink.h
@@ -21,7 +21,7 @@
 class OutputDevice;
 
 class MEDIA_EXPORT NullAudioSink
-    : NON_EXPORTED_BASE(public AudioRendererSink) {
+    : NON_EXPORTED_BASE(public RestartableAudioRendererSink) {
  public:
   NullAudioSink(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
 
@@ -49,6 +49,7 @@
   void CallRender();
 
   bool initialized_;
+  bool started_;
   bool playing_;
   RenderCallback* callback_;
 
diff --git a/media/audio/win/audio_device_listener_win.cc b/media/audio/win/audio_device_listener_win.cc
index 505007ba..056ab7c 100644
--- a/media/audio/win/audio_device_listener_win.cc
+++ b/media/audio/win/audio_device_listener_win.cc
@@ -8,7 +8,6 @@
 
 #include "base/logging.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/system_monitor/system_monitor.h"
 #include "base/time/default_tick_clock.h"
 #include "base/win/scoped_co_mem.h"
 #include "base/win/windows_version.h"
@@ -31,7 +30,7 @@
   }
 }
 
-AudioDeviceListenerWin::AudioDeviceListenerWin(const base::Closure& listener_cb)
+AudioDeviceListenerWin::AudioDeviceListenerWin(const ListenerCB& listener_cb)
     : listener_cb_(listener_cb), tick_clock_(new base::DefaultTickClock()) {
   CHECK(CoreAudioUtil::IsSupported());
 
@@ -98,10 +97,7 @@
 
 STDMETHODIMP AudioDeviceListenerWin::OnDeviceStateChanged(LPCWSTR device_id,
                                                           DWORD new_state) {
-  base::SystemMonitor* monitor = base::SystemMonitor::Get();
-  if (monitor)
-    monitor->ProcessDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO_CAPTURE);
-
+  listener_cb_.Run(kInputDeviceChange);
   return S_OK;
 }
 
@@ -131,7 +127,7 @@
       now - last_device_change_time_ >
           base::TimeDelta::FromMilliseconds(kDeviceChangeLimitMs)) {
     last_device_change_time_ = now;
-    listener_cb_.Run();
+    listener_cb_.Run(kOutputDeviceChange);
     did_run_listener_cb = true;
   }
 
diff --git a/media/audio/win/audio_device_listener_win.h b/media/audio/win/audio_device_listener_win.h
index 053afa6..8875269 100644
--- a/media/audio/win/audio_device_listener_win.h
+++ b/media/audio/win/audio_device_listener_win.h
@@ -31,10 +31,14 @@
 // TODO(dalecurtis, henrika): Support input device changes.
 class MEDIA_EXPORT AudioDeviceListenerWin : public IMMNotificationClient {
  public:
+  // Callback returns whether input or output devices have changed.
+  enum DeviceNotificationType { kInputDeviceChange, kOutputDeviceChange };
+  using ListenerCB = base::Callback<void(DeviceNotificationType)>;
+
   // The listener callback will be called from a system level multimedia thread,
   // thus the callee must be thread safe.  |listener| is a permanent callback
   // and must outlive AudioDeviceListenerWin.
-  explicit AudioDeviceListenerWin(const base::Closure& listener_cb);
+  explicit AudioDeviceListenerWin(const ListenerCB& listener_cb);
   virtual ~AudioDeviceListenerWin();
 
  private:
@@ -56,7 +60,7 @@
                                     ERole role,
                                     LPCWSTR new_default_device_id) override;
 
-  base::Closure listener_cb_;
+  ListenerCB listener_cb_;
   ScopedComPtr<IMMDeviceEnumerator> device_enumerator_;
 
   // Used to rate limit device change events.
diff --git a/media/audio/win/audio_device_listener_win_unittest.cc b/media/audio/win/audio_device_listener_win_unittest.cc
index 4b78d93..855c590a 100644
--- a/media/audio/win/audio_device_listener_win_unittest.cc
+++ b/media/audio/win/audio_device_listener_win_unittest.cc
@@ -60,8 +60,8 @@
         base::ASCIIToUTF16(new_device_id).c_str()) == S_OK;
   }
 
-
-  MOCK_METHOD0(OnDeviceChange, void());
+  MOCK_METHOD1(OnDeviceChange,
+               void(AudioDeviceListenerWin::DeviceNotificationType));
 
  private:
   ScopedCOMInitializer com_init_;
@@ -75,12 +75,16 @@
 TEST_F(AudioDeviceListenerWinTest, OutputDeviceChange) {
   ABORT_AUDIO_TEST_IF_NOT(CoreAudioUtil::IsSupported());
 
-  EXPECT_CALL(*this, OnDeviceChange()).Times(1);
+  EXPECT_CALL(*this,
+              OnDeviceChange(AudioDeviceListenerWin::kOutputDeviceChange))
+      .Times(1);
   ASSERT_TRUE(SimulateDefaultOutputDeviceChange(kFirstTestDevice));
 
   testing::Mock::VerifyAndClear(this);
   AdvanceLastDeviceChangeTime();
-  EXPECT_CALL(*this, OnDeviceChange()).Times(1);
+  EXPECT_CALL(*this,
+              OnDeviceChange(AudioDeviceListenerWin::kOutputDeviceChange))
+      .Times(1);
   ASSERT_TRUE(SimulateDefaultOutputDeviceChange(kSecondTestDevice));
 
   // The second device event should be ignored since it occurs too soon.
@@ -92,17 +96,23 @@
 TEST_F(AudioDeviceListenerWinTest, NullOutputDeviceChange) {
   ABORT_AUDIO_TEST_IF_NOT(CoreAudioUtil::IsSupported());
 
-  EXPECT_CALL(*this, OnDeviceChange()).Times(1);
+  EXPECT_CALL(*this,
+              OnDeviceChange(AudioDeviceListenerWin::kOutputDeviceChange))
+      .Times(1);
   ASSERT_TRUE(SimulateNullDefaultOutputDeviceChange());
 
   testing::Mock::VerifyAndClear(this);
   AdvanceLastDeviceChangeTime();
-  EXPECT_CALL(*this, OnDeviceChange()).Times(1);
+  EXPECT_CALL(*this,
+              OnDeviceChange(AudioDeviceListenerWin::kOutputDeviceChange))
+      .Times(1);
   ASSERT_TRUE(SimulateDefaultOutputDeviceChange(kFirstTestDevice));
 
   testing::Mock::VerifyAndClear(this);
   AdvanceLastDeviceChangeTime();
-  EXPECT_CALL(*this, OnDeviceChange()).Times(1);
+  EXPECT_CALL(*this,
+              OnDeviceChange(AudioDeviceListenerWin::kOutputDeviceChange))
+      .Times(1);
   ASSERT_TRUE(SimulateNullDefaultOutputDeviceChange());
 }
 
diff --git a/media/audio/win/audio_manager_win.cc b/media/audio/win/audio_manager_win.cc
index 70e6c1b..0b97afbc 100644
--- a/media/audio/win/audio_manager_win.cc
+++ b/media/audio/win/audio_manager_win.cc
@@ -21,9 +21,9 @@
 #include "base/process/launch.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
+#include "base/system_monitor/system_monitor.h"
 #include "base/win/windows_version.h"
 #include "media/audio/audio_parameters.h"
-#include "media/audio/win/audio_device_listener_win.h"
 #include "media/audio/win/audio_low_latency_input_win.h"
 #include "media/audio/win/audio_low_latency_output_win.h"
 #include "media/audio/win/audio_manager_win.h"
@@ -171,7 +171,7 @@
     // AudioDeviceListenerWin must be initialized on a COM thread and should
     // only be used if WASAPI / Core Audio is supported.
     output_device_listener_.reset(new AudioDeviceListenerWin(BindToCurrentLoop(
-        base::Bind(&AudioManagerWin::NotifyAllOutputDeviceChangeListeners,
+        base::Bind(&AudioManagerWin::StallAudioThreadAfterDeviceChange,
                    base::Unretained(this)))));
   }
 }
@@ -538,6 +538,23 @@
                                        xp_device_id);
 }
 
+void AudioManagerWin::StallAudioThreadAfterDeviceChange(
+    AudioDeviceListenerWin::DeviceNotificationType notification_type) {
+  base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
+
+  if (notification_type == AudioDeviceListenerWin::kInputDeviceChange) {
+    base::SystemMonitor* monitor = base::SystemMonitor::Get();
+    if (monitor) {
+      monitor->ProcessDevicesChanged(
+          base::SystemMonitor::DEVTYPE_AUDIO_CAPTURE);
+    }
+    return;
+  }
+
+  DCHECK_EQ(notification_type, AudioDeviceListenerWin::kOutputDeviceChange);
+  NotifyAllOutputDeviceChangeListeners();
+}
+
 /// static
 AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory) {
   return new AudioManagerWin(audio_log_factory);
diff --git a/media/audio/win/audio_manager_win.h b/media/audio/win/audio_manager_win.h
index 9826566..3d33b55 100644
--- a/media/audio/win/audio_manager_win.h
+++ b/media/audio/win/audio_manager_win.h
@@ -8,11 +8,10 @@
 #include <string>
 
 #include "media/audio/audio_manager_base.h"
+#include "media/audio/win/audio_device_listener_win.h"
 
 namespace media {
 
-class AudioDeviceListenerWin;
-
 // Windows implementation of the AudioManager singleton. This class is internal
 // to the audio output and only internal users can call methods not exposed by
 // the AudioManager class.
@@ -88,6 +87,12 @@
 
   void GetAudioDeviceNamesImpl(bool input, AudioDeviceNames* device_names);
 
+  // We frequently see deadlock in third party Windows audio drivers, so after
+  // a device change is detected, stall for a second before allowing calls into
+  // the Windows audio subsystem.  See http://crbug.com/422522
+  void StallAudioThreadAfterDeviceChange(
+      AudioDeviceListenerWin::DeviceNotificationType notification_type);
+
   // Listen for output device changes.
   scoped_ptr<AudioDeviceListenerWin> output_device_listener_;
 
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 2cf8802..b01c488 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -359,6 +359,7 @@
   configs += [ "//media:media_config" ]
   deps = [
     "//testing/gmock",
+    "//media:shared_memory_support",
   ]
 }
 
diff --git a/media/base/audio_renderer_mixer_input.cc b/media/base/audio_renderer_mixer_input.cc
index 73166d36..9c5c3726 100644
--- a/media/base/audio_renderer_mixer_input.cc
+++ b/media/base/audio_renderer_mixer_input.cc
@@ -15,8 +15,8 @@
     const RemoveMixerCB& remove_mixer_cb,
     const std::string& device_id,
     const url::Origin& security_origin)
-    : playing_(false),
-      initialized_(false),
+    : initialized_(false),
+      playing_(false),
       volume_(1.0f),
       get_mixer_cb_(get_mixer_cb),
       remove_mixer_cb_(remove_mixer_cb),
@@ -28,15 +28,14 @@
                            base::Unretained(this))) {}
 
 AudioRendererMixerInput::~AudioRendererMixerInput() {
-  DCHECK(!playing_);
   DCHECK(!mixer_);
 }
 
 void AudioRendererMixerInput::Initialize(
     const AudioParameters& params,
     AudioRendererSink::RenderCallback* callback) {
+  DCHECK(!mixer_);
   DCHECK(callback);
-  DCHECK(!initialized_);
 
   params_ = params;
   callback_ = callback;
@@ -45,7 +44,6 @@
 
 void AudioRendererMixerInput::Start() {
   DCHECK(initialized_);
-  DCHECK(!playing_);
   DCHECK(!mixer_);
   mixer_ = get_mixer_cb_.Run(params_, device_id_, security_origin_, nullptr);
   if (!mixer_) {
diff --git a/media/base/audio_renderer_mixer_input.h b/media/base/audio_renderer_mixer_input.h
index e2c5932..9ec4518 100644
--- a/media/base/audio_renderer_mixer_input.h
+++ b/media/base/audio_renderer_mixer_input.h
@@ -17,7 +17,7 @@
 class AudioRendererMixer;
 
 class MEDIA_EXPORT AudioRendererMixerInput
-    : NON_EXPORTED_BASE(public AudioRendererSink),
+    : NON_EXPORTED_BASE(public RestartableAudioRendererSink),
       NON_EXPORTED_BASE(public OutputDevice),
       public AudioConverter::InputCallback {
  public:
@@ -36,7 +36,7 @@
                           const std::string& device_id,
                           const url::Origin& security_origin);
 
-  // AudioRendererSink implementation.
+  // RestartableAudioRendererSink implementation.
   void Start() override;
   void Stop() override;
   void Play() override;
@@ -62,8 +62,8 @@
  private:
   friend class AudioRendererMixerInputTest;
 
-  bool playing_;
   bool initialized_;
+  bool playing_;
   double volume_;
 
   // AudioConverter::InputCallback implementation.
diff --git a/media/base/audio_renderer_mixer_input_unittest.cc b/media/base/audio_renderer_mixer_input_unittest.cc
index c268578..2f8f9772 100644
--- a/media/base/audio_renderer_mixer_input_unittest.cc
+++ b/media/base/audio_renderer_mixer_input_unittest.cc
@@ -147,13 +147,21 @@
 }
 
 // Test that Start() can be called after Stop().
-// TODO(dalecurtis): We shouldn't allow this.  See http://crbug.com/151051
 TEST_F(AudioRendererMixerInputTest, StartAfterStop) {
   mixer_input_->Stop();
   mixer_input_->Start();
   mixer_input_->Stop();
 }
 
+// Test that Initialize() can be called again after Stop().
+TEST_F(AudioRendererMixerInputTest, InitializeAfterStop) {
+  mixer_input_->Initialize(audio_parameters_, fake_callback_.get());
+  mixer_input_->Start();
+  mixer_input_->Stop();
+  mixer_input_->Initialize(audio_parameters_, fake_callback_.get());
+  mixer_input_->Stop();
+}
+
 // Test SwitchOutputDevice().
 TEST_F(AudioRendererMixerInputTest, SwitchOutputDevice) {
   mixer_input_->Start();
diff --git a/media/base/audio_renderer_sink.h b/media/base/audio_renderer_sink.h
index 1e091af..30cbfef5 100644
--- a/media/base/audio_renderer_sink.h
+++ b/media/base/audio_renderer_sink.h
@@ -79,6 +79,16 @@
   virtual ~AudioRendererSink() {}
 };
 
+// Same as AudioRendererSink except that Initialize() and Start() can be called
+// again after Stop().
+// TODO(sandersd): Fold back into AudioRendererSink once all subclasses support
+// this.
+
+class RestartableAudioRendererSink : public AudioRendererSink {
+ protected:
+  ~RestartableAudioRendererSink() override {}
+};
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_AUDIO_RENDERER_SINK_H_
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index b989733..9f39d7d5 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -20,6 +20,10 @@
 // Sets the MediaSource player that uses the separate media thread
 const char kEnableMediaThreadForMediaPlayback[] =
     "enable-media-thread-for-media-playback";
+
+// Use WebMediaPlayerImpl instead of WebMediaPlayerAndroid. This is a temporary
+// switch for experimenting with unifying the Android playback pipeline.
+const char kEnableUnifiedMediaPipeline[] = "enable-unified-media-pipeline";
 #endif
 
 #if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_SOLARIS)
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 03b035e8..bcaa81a 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -19,6 +19,7 @@
 #if defined(OS_ANDROID)
 MEDIA_EXPORT extern const char kDisableMediaThreadForMediaPlayback[];
 MEDIA_EXPORT extern const char kEnableMediaThreadForMediaPlayback[];
+MEDIA_EXPORT extern const char kEnableUnifiedMediaPipeline[];
 #endif
 
 #if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_SOLARIS)
diff --git a/media/base/mock_audio_renderer_sink.h b/media/base/mock_audio_renderer_sink.h
index c44ac401..a966f710 100644
--- a/media/base/mock_audio_renderer_sink.h
+++ b/media/base/mock_audio_renderer_sink.h
@@ -15,7 +15,7 @@
 
 class FakeOutputDevice;
 
-class MockAudioRendererSink : public AudioRendererSink {
+class MockAudioRendererSink : public RestartableAudioRendererSink {
  public:
   MockAudioRendererSink();
   explicit MockAudioRendererSink(OutputDeviceStatus device_status);
diff --git a/media/blink/buffered_resource_loader.cc b/media/blink/buffered_resource_loader.cc
index 9abce3f..ab3a5830 100644
--- a/media/blink/buffered_resource_loader.cc
+++ b/media/blink/buffered_resource_loader.cc
@@ -578,8 +578,9 @@
 }
 
 bool BufferedResourceLoader::DidPassCORSAccessCheck() const {
-  DCHECK(start_cb_.is_null())
-      << "Start() must complete before calling DidPassCORSAccessCheck()";
+  // Until Start() is done we don't know, assume no until we know.
+  if (!start_cb_.is_null())
+    return false;
   return !loader_failed_ && cors_mode_ != kUnspecified;
 }
 
diff --git a/media/blink/webaudiosourceprovider_impl.cc b/media/blink/webaudiosourceprovider_impl.cc
index 6efda722..ddc79fe 100644
--- a/media/blink/webaudiosourceprovider_impl.cc
+++ b/media/blink/webaudiosourceprovider_impl.cc
@@ -47,7 +47,7 @@
 }  // namespace
 
 WebAudioSourceProviderImpl::WebAudioSourceProviderImpl(
-    const scoped_refptr<AudioRendererSink>& sink)
+    const scoped_refptr<RestartableAudioRendererSink>& sink)
     : channels_(0),
       sample_rate_(0),
       volume_(1.0),
@@ -126,6 +126,7 @@
 
 void WebAudioSourceProviderImpl::Start() {
   base::AutoLock auto_lock(sink_lock_);
+  DCHECK(renderer_);
   DCHECK_EQ(state_, kStopped);
   state_ = kStarted;
   if (!client_)
@@ -172,7 +173,6 @@
     const AudioParameters& params,
     RenderCallback* renderer) {
   base::AutoLock auto_lock(sink_lock_);
-  CHECK(!renderer_);
   renderer_ = renderer;
 
   DCHECK_EQ(state_, kStopped);
diff --git a/media/blink/webaudiosourceprovider_impl.h b/media/blink/webaudiosourceprovider_impl.h
index 675be92..947c33c 100644
--- a/media/blink/webaudiosourceprovider_impl.h
+++ b/media/blink/webaudiosourceprovider_impl.h
@@ -32,17 +32,17 @@
 // All calls are protected by a lock.
 class MEDIA_BLINK_EXPORT WebAudioSourceProviderImpl
     : NON_EXPORTED_BASE(public blink::WebAudioSourceProvider),
-      NON_EXPORTED_BASE(public AudioRendererSink) {
+      NON_EXPORTED_BASE(public RestartableAudioRendererSink) {
  public:
   explicit WebAudioSourceProviderImpl(
-      const scoped_refptr<AudioRendererSink>& sink);
+      const scoped_refptr<RestartableAudioRendererSink>& sink);
 
   // blink::WebAudioSourceProvider implementation.
   void setClient(blink::WebAudioSourceProviderClient* client) override;
   void provideInput(const blink::WebVector<float*>& audio_data,
                     size_t number_of_frames) override;
 
-  // AudioRendererSink implementation.
+  // RestartableAudioRendererSink implementation.
   void Start() override;
   void Stop() override;
   void Play() override;
@@ -79,7 +79,7 @@
 
   // Where audio ends up unless overridden by |client_|.
   base::Lock sink_lock_;
-  scoped_refptr<AudioRendererSink> sink_;
+  scoped_refptr<RestartableAudioRendererSink> sink_;
   scoped_ptr<AudioBus> bus_wrapper_;
 
   // NOTE: Weak pointers must be invalidated before all other member variables.
diff --git a/media/blink/webmediaplayer_params.cc b/media/blink/webmediaplayer_params.cc
index ffe3c1b7..530d5c9 100644
--- a/media/blink/webmediaplayer_params.cc
+++ b/media/blink/webmediaplayer_params.cc
@@ -13,7 +13,7 @@
 
 WebMediaPlayerParams::WebMediaPlayerParams(
     const DeferLoadCB& defer_load_cb,
-    const scoped_refptr<AudioRendererSink>& audio_renderer_sink,
+    const scoped_refptr<RestartableAudioRendererSink>& audio_renderer_sink,
     const scoped_refptr<MediaLog>& media_log,
     const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
diff --git a/media/blink/webmediaplayer_params.h b/media/blink/webmediaplayer_params.h
index 35f5134..8022431 100644
--- a/media/blink/webmediaplayer_params.h
+++ b/media/blink/webmediaplayer_params.h
@@ -22,7 +22,7 @@
 
 namespace media {
 
-class AudioRendererSink;
+class RestartableAudioRendererSink;
 class MediaLog;
 class MediaPermission;
 
@@ -44,7 +44,7 @@
   // |context_3d_cb| may be null.
   WebMediaPlayerParams(
       const DeferLoadCB& defer_load_cb,
-      const scoped_refptr<AudioRendererSink>& audio_renderer_sink,
+      const scoped_refptr<RestartableAudioRendererSink>& audio_renderer_sink,
       const scoped_refptr<MediaLog>& media_log,
       const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
@@ -58,7 +58,8 @@
 
   DeferLoadCB defer_load_cb() const { return defer_load_cb_; }
 
-  const scoped_refptr<AudioRendererSink>& audio_renderer_sink() const {
+  const scoped_refptr<RestartableAudioRendererSink>& audio_renderer_sink()
+      const {
     return audio_renderer_sink_;
   }
 
@@ -93,7 +94,7 @@
 
  private:
   DeferLoadCB defer_load_cb_;
-  scoped_refptr<AudioRendererSink> audio_renderer_sink_;
+  scoped_refptr<RestartableAudioRendererSink> audio_renderer_sink_;
   scoped_refptr<MediaLog> media_log_;
   scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
   scoped_refptr<base::TaskRunner> worker_task_runner_;
diff --git a/mojo/application/public/cpp/application_impl.h b/mojo/application/public/cpp/application_impl.h
index 4184ccc8..90e79596 100644
--- a/mojo/application/public/cpp/application_impl.h
+++ b/mojo/application/public/cpp/application_impl.h
@@ -114,6 +114,10 @@
     connection->ConnectToService(ptr);
   }
 
+  // Block the calling thread until the Initialize() method is called by the
+  // shell.
+  void WaitForInitialize();
+
   // Initiate shutdown of this application. This may involve a round trip to the
   // Shell to ensure there are no inbound service requests.
   void Quit();
diff --git a/mojo/application/public/cpp/lib/application_impl.cc b/mojo/application/public/cpp/lib/application_impl.cc
index 31da811..6d2fb46 100644
--- a/mojo/application/public/cpp/lib/application_impl.cc
+++ b/mojo/application/public/cpp/lib/application_impl.cc
@@ -86,11 +86,9 @@
   return registry.Pass();
 }
 
-void ApplicationImpl::Initialize(ShellPtr shell, const mojo::String& url) {
-  shell_ = shell.Pass();
-  shell_.set_connection_error_handler([this]() { OnConnectionError(); });
-  url_ = url;
-  delegate_->Initialize(this);
+void ApplicationImpl::WaitForInitialize() {
+  DCHECK(!shell_.is_bound());
+  binding_.WaitForIncomingMethodCall();
 }
 
 void ApplicationImpl::Quit() {
@@ -104,6 +102,13 @@
   }
 }
 
+void ApplicationImpl::Initialize(ShellPtr shell, const mojo::String& url) {
+  shell_ = shell.Pass();
+  shell_.set_connection_error_handler([this]() { OnConnectionError(); });
+  url_ = url;
+  delegate_->Initialize(this);
+}
+
 void ApplicationImpl::AcceptConnection(
     const String& requestor_url,
     InterfaceRequest<ServiceProvider> services,
diff --git a/mojo/runner/BUILD.gn b/mojo/runner/BUILD.gn
index 92a2342a..3c1dec9 100644
--- a/mojo/runner/BUILD.gn
+++ b/mojo/runner/BUILD.gn
@@ -162,10 +162,12 @@
     ":switches",
   ]
 
-  data_deps = [
-    "//components/devtools_service",
-    "//mojo/services/tracing",
-  ]
+  if (!is_component_build) {
+    data_deps = [
+      "//components/devtools_service",
+      "//mojo/services/tracing",
+    ]
+  }
 
   if (is_android) {
     sources += [
diff --git a/mojo/runner/context.cc b/mojo/runner/context.cc
index e4819a7..87e4157 100644
--- a/mojo/runner/context.cc
+++ b/mojo/runner/context.cc
@@ -208,10 +208,16 @@
   RegisterLocalAliases(package_manager_);
 
   scoped_ptr<shell::NativeRunnerFactory> runner_factory;
-  if (command_line.HasSwitch(switches::kEnableMultiprocess))
+  if (command_line.HasSwitch(switches::kEnableMultiprocess)) {
     runner_factory.reset(new OutOfProcessNativeRunnerFactory(this));
-  else
+  } else {
+#if defined(COMPONENT_BUILD)
+    LOG(ERROR) << "Running Mojo in single process component build, which isn't "
+               << "supported because statics in apps interact. Use static build"
+               << " or don't pass --single-process.";
+#endif
     runner_factory.reset(new InProcessNativeRunnerFactory(this));
+  }
   application_manager_.reset(new shell::ApplicationManager(
       make_scoped_ptr(package_manager_), runner_factory.Pass(),
       task_runners_->blocking_pool()));
diff --git a/mojo/services/network/url_loader_impl_apptest.cc b/mojo/services/network/url_loader_impl_apptest.cc
index 76c1fee6..f21d684 100644
--- a/mojo/services/network/url_loader_impl_apptest.cc
+++ b/mojo/services/network/url_loader_impl_apptest.cc
@@ -49,22 +49,30 @@
 
   void Start() override { status_ = STARTED; }
 
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override {
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override {
     status_ = READING;
     buf_size_ = buf_size;
-    return net::ERR_IO_PENDING;
+    SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+    return false;
   }
 
   void NotifyHeadersComplete() { net::URLRequestJob::NotifyHeadersComplete(); }
 
-  void NotifyReadComplete(int result) {
-    status_ = result <= 0 ? COMPLETED : STARTED;
-
-    // Map errors to net::ERR_FAILED.
-    if (result < 0)
-      result = net::ERR_FAILED;
-
-    ReadRawDataComplete(result);
+  void NotifyReadComplete(int bytes_read) {
+    if (bytes_read < 0) {
+      status_ = COMPLETED;
+      NotifyDone(net::URLRequestStatus(
+          net::URLRequestStatus::FromError(net::ERR_FAILED)));
+      net::URLRequestJob::NotifyReadComplete(0);
+    } else if (bytes_read == 0) {
+      status_ = COMPLETED;
+      NotifyDone(net::URLRequestStatus());
+      net::URLRequestJob::NotifyReadComplete(bytes_read);
+    } else {
+      status_ = STARTED;
+      SetStatus(net::URLRequestStatus());
+      net::URLRequestJob::NotifyReadComplete(bytes_read);
+    }
   }
 
  private:
@@ -79,13 +87,19 @@
 
 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
  public:
-  net::URLRequestJob* MaybeCreateJob(
+  explicit TestProtocolHandler(const base::Closure& quit_closure)
+      : quit_closure_(quit_closure) {}
+    net::URLRequestJob* MaybeCreateJob(
       net::URLRequest* request,
       net::NetworkDelegate* network_delegate) const override {
+    quit_closure_.Run();
     return new TestURLRequestJob(request, network_delegate);
   }
 
   ~TestProtocolHandler() override {}
+
+ private:
+  base::Closure quit_closure_;
 };
 
 class UrlLoaderImplTest : public test::ApplicationTestBase {
@@ -103,7 +117,8 @@
     scoped_ptr<net::TestURLRequestContext> url_request_context(
         new net::TestURLRequestContext(true));
     ASSERT_TRUE(url_request_job_factory_.SetProtocolHandler(
-        "http", make_scoped_ptr(new TestProtocolHandler())));
+        "http", make_scoped_ptr(new TestProtocolHandler(
+            wait_for_request_.QuitClosure()))));
     url_request_context->set_job_factory(&url_request_job_factory_);
     url_request_context->Init();
     network_context_.reset(new NetworkContext(url_request_context.Pass()));
@@ -123,13 +138,14 @@
   net::URLRequestJobFactoryImpl url_request_job_factory_;
   scoped_ptr<NetworkContext> network_context_;
   URLLoaderPtr url_loader_proxy_;
+  base::RunLoop wait_for_request_;
 };
 
 TEST_F(UrlLoaderImplTest, ClosedBeforeAnyCall) {
   url_loader_proxy_.reset();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_FALSE(IsUrlLoaderValid());
+  while (IsUrlLoaderValid())
+    base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(UrlLoaderImplTest, ClosedWhileWaitingOnTheNetwork) {
@@ -139,7 +155,7 @@
   URLResponsePtr response;
   url_loader_proxy_->Start(request.Pass(),
                            base::Bind(&PassA<URLResponsePtr>, &response));
-  base::RunLoop().RunUntilIdle();
+  wait_for_request_.Run();
 
   EXPECT_TRUE(IsUrlLoaderValid());
   EXPECT_FALSE(response);
@@ -158,9 +174,9 @@
   EXPECT_TRUE(IsUrlLoaderValid());
 
   response.reset();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_FALSE(IsUrlLoaderValid());
+  while (IsUrlLoaderValid())
+    base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(UrlLoaderImplTest, ClosedWhileWaitingOnThePipeToBeWriteable) {
@@ -170,20 +186,23 @@
   URLResponsePtr response;
   url_loader_proxy_->Start(request.Pass(),
                            base::Bind(&PassA<URLResponsePtr>, &response));
-  base::RunLoop().RunUntilIdle();
+  wait_for_request_.Run();
 
   EXPECT_TRUE(IsUrlLoaderValid());
   EXPECT_FALSE(response);
   ASSERT_TRUE(g_current_job);
 
   g_current_job->NotifyHeadersComplete();
-  base::RunLoop().RunUntilIdle();
+  while (g_current_job->status() != TestURLRequestJob::READING)
+    base::RunLoop().RunUntilIdle();
+
+  while (!response)
+    base::RunLoop().RunUntilIdle();
 
   EXPECT_TRUE(IsUrlLoaderValid());
-  EXPECT_TRUE(response);
   EXPECT_EQ(TestURLRequestJob::READING, g_current_job->status());
 
-  while (g_current_job->status() == TestURLRequestJob::READING) {
+  while (g_current_job->status() != TestURLRequestJob::STARTED) {
     g_current_job->NotifyReadComplete(g_current_job->buf_size());
     base::RunLoop().RunUntilIdle();
   }
@@ -196,9 +215,9 @@
   EXPECT_TRUE(IsUrlLoaderValid());
 
   response.reset();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_FALSE(IsUrlLoaderValid());
+  while (IsUrlLoaderValid())
+    base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(UrlLoaderImplTest, RequestCompleted) {
@@ -208,7 +227,7 @@
   URLResponsePtr response;
   url_loader_proxy_->Start(request.Pass(),
                            base::Bind(&PassA<URLResponsePtr>, &response));
-  base::RunLoop().RunUntilIdle();
+  wait_for_request_.Run();
 
   EXPECT_TRUE(IsUrlLoaderValid());
   EXPECT_FALSE(response);
@@ -227,9 +246,9 @@
   EXPECT_TRUE(IsUrlLoaderValid());
 
   g_current_job->NotifyReadComplete(0);
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_FALSE(IsUrlLoaderValid());
+  while (IsUrlLoaderValid())
+    base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(UrlLoaderImplTest, RequestFailed) {
@@ -239,7 +258,7 @@
   URLResponsePtr response;
   url_loader_proxy_->Start(request.Pass(),
                            base::Bind(&PassA<URLResponsePtr>, &response));
-  base::RunLoop().RunUntilIdle();
+  wait_for_request_.Run();
 
   EXPECT_TRUE(IsUrlLoaderValid());
   EXPECT_FALSE(response);
@@ -258,9 +277,9 @@
   EXPECT_TRUE(IsUrlLoaderValid());
 
   g_current_job->NotifyReadComplete(-1);
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_FALSE(IsUrlLoaderValid());
+  while (IsUrlLoaderValid())
+    base::RunLoop().RunUntilIdle();
 }
 
 }  // namespace mojo
diff --git a/net/cert/cert_verify_proc_whitelist.cc b/net/cert/cert_verify_proc_whitelist.cc
index 9962327..c2437f8 100644
--- a/net/cert/cert_verify_proc_whitelist.cc
+++ b/net/cert/cert_verify_proc_whitelist.cc
@@ -22,10 +22,6 @@
       0xa0, 0xa8, 0xbb, 0xa5, 0x0a, 0x72, 0xd4, 0xe1,
       0x83, 0x9a, 0x94, 0xfb, 0x1a, 0x58, 0x5a, 0xd7,
       0x2a, 0x7a, 0xac, 0x3c, 0x72, 0x56, 0x1f, 0xc0 },
-    { 0x00, 0xc6, 0x81, 0x13, 0x16, 0xbd, 0x9c, 0x91,
-      0x98, 0x6e, 0xa9, 0x7e, 0x2c, 0x30, 0xab, 0xef,
-      0xa0, 0xd5, 0x68, 0x04, 0x89, 0x0d, 0x65, 0x8d,
-      0xff, 0x08, 0x59, 0x11, 0x6e, 0xb4, 0xc2, 0x32 },
     { 0x00, 0xde, 0xff, 0x68, 0x2e, 0x35, 0x10, 0x22,
       0xcc, 0x3b, 0xbb, 0x4e, 0xb5, 0x88, 0x0a, 0x97,
       0x27, 0x88, 0x0a, 0xf3, 0x52, 0xfb, 0xbe, 0x2f,
@@ -78,10 +74,6 @@
       0x4d, 0x8e, 0x3b, 0xc9, 0xc8, 0x7c, 0x02, 0x4e,
       0x4b, 0xb7, 0x0d, 0xc6, 0x30, 0x1b, 0xcd, 0xe3,
       0x24, 0x12, 0xb4, 0xce, 0x8c, 0x0c, 0x14, 0x58 },
-    { 0x03, 0xde, 0x42, 0xaf, 0x1f, 0x30, 0x9f, 0x95,
-      0xf6, 0xc8, 0x91, 0x03, 0xea, 0x98, 0x7e, 0x84,
-      0xd3, 0x18, 0x6b, 0x60, 0x65, 0xf9, 0x60, 0x7a,
-      0x06, 0x6a, 0x30, 0x2b, 0x58, 0x05, 0xeb, 0x3b },
     { 0x03, 0xe0, 0x6e, 0x0b, 0x7a, 0x2c, 0xba, 0xe4,
       0xb6, 0x8b, 0xce, 0x5f, 0x83, 0xe7, 0xa9, 0x31,
       0x6e, 0xd7, 0x82, 0x3e, 0x8d, 0x94, 0x85, 0x38,
@@ -102,10 +94,6 @@
       0x55, 0xdf, 0xe2, 0x54, 0xc8, 0x20, 0xa0, 0x77,
       0xff, 0x11, 0xca, 0xfc, 0x83, 0xb5, 0x0e, 0x0a,
       0x13, 0xf1, 0x3d, 0x59, 0xd3, 0xca, 0x6c, 0xaf },
-    { 0x04, 0x71, 0x57, 0x2c, 0x03, 0x03, 0x7d, 0xee,
-      0x2b, 0x40, 0x09, 0x6e, 0xe8, 0xaa, 0x37, 0x82,
-      0xc6, 0xfa, 0x81, 0x42, 0xcc, 0xa2, 0x68, 0x19,
-      0x09, 0xda, 0xe8, 0xc4, 0x66, 0xd0, 0x58, 0x4e },
     { 0x04, 0x80, 0x71, 0x3a, 0x76, 0x91, 0x7e, 0xb1,
       0x7f, 0xb5, 0x4c, 0x93, 0xee, 0xd3, 0xfd, 0x8a,
       0x98, 0x2b, 0xd9, 0x06, 0x9c, 0x69, 0xab, 0xea,
@@ -254,10 +242,6 @@
       0x23, 0x4a, 0x86, 0xc7, 0x0d, 0x49, 0x8c, 0x62,
       0x60, 0x7f, 0x37, 0x44, 0xea, 0x71, 0xf1, 0x83,
       0x1d, 0xcf, 0xca, 0xf3, 0xaf, 0x15, 0x56, 0x9c },
-    { 0x0f, 0x43, 0xfc, 0x12, 0x47, 0x01, 0xfe, 0x29,
-      0xb7, 0x14, 0xf3, 0x05, 0xe2, 0x61, 0xb6, 0x32,
-      0x04, 0x82, 0xc0, 0x09, 0x6f, 0xfe, 0xad, 0x35,
-      0xe1, 0xf8, 0xe6, 0x32, 0xc6, 0x4d, 0x7b, 0x20 },
     { 0x0f, 0x57, 0xed, 0x67, 0x2b, 0xac, 0x50, 0x14,
       0x89, 0xe4, 0xf4, 0xab, 0x4b, 0x1d, 0xb1, 0x75,
       0x81, 0xfe, 0xb8, 0x76, 0x0f, 0xfb, 0xc0, 0x8a,
@@ -298,14 +282,6 @@
       0x5f, 0xdc, 0xac, 0x20, 0xa2, 0x36, 0xf8, 0x6e,
       0x94, 0xe5, 0xee, 0x58, 0x59, 0xd8, 0xfd, 0x45,
       0xe9, 0xe9, 0xc5, 0xa6, 0xc5, 0xc0, 0xa4, 0x13 },
-    { 0x13, 0xbd, 0x07, 0x7b, 0x8a, 0x9f, 0x46, 0xff,
-      0x8f, 0x2f, 0xfd, 0x23, 0x6e, 0x53, 0xa7, 0x2c,
-      0x3b, 0x87, 0xf3, 0x4c, 0xc9, 0xdb, 0xb5, 0x81,
-      0x7e, 0x4d, 0xba, 0x1b, 0xd3, 0xbc, 0x9e, 0x5f },
-    { 0x13, 0xe0, 0x1b, 0xe5, 0x72, 0xdc, 0x11, 0xfa,
-      0xc3, 0xb4, 0x7a, 0xe6, 0x8f, 0x92, 0xdc, 0x00,
-      0xf1, 0x00, 0xbf, 0x77, 0x53, 0x7b, 0x89, 0x47,
-      0xf4, 0xc1, 0x1c, 0x25, 0xa0, 0xb6, 0xf9, 0xf6 },
     { 0x14, 0x21, 0x28, 0xa6, 0x65, 0x1c, 0xdc, 0x18,
       0x70, 0xc2, 0x67, 0x5e, 0xc0, 0xb0, 0xef, 0x32,
       0xb5, 0xd4, 0xc1, 0x55, 0x35, 0x8e, 0x7e, 0xd9,
@@ -334,14 +310,6 @@
       0xbf, 0x2f, 0x83, 0xc2, 0x80, 0xd1, 0x24, 0x6d,
       0xce, 0x02, 0xa6, 0x28, 0x31, 0x26, 0xc6, 0x17,
       0xe4, 0x17, 0xd2, 0xb7, 0xea, 0xc1, 0x19, 0x24 },
-    { 0x15, 0x75, 0x93, 0x18, 0x80, 0x19, 0x6d, 0xe8,
-      0x0d, 0x97, 0xfe, 0xf1, 0x85, 0xd2, 0x7a, 0xf6,
-      0xad, 0x6b, 0x5b, 0x04, 0x0d, 0x87, 0x6c, 0xdf,
-      0x4a, 0x39, 0xb5, 0xb7, 0x8e, 0x96, 0xb7, 0xd5 },
-    { 0x15, 0xb0, 0xd9, 0xbe, 0xd6, 0x2b, 0xd8, 0x96,
-      0x11, 0x59, 0xfe, 0x7e, 0x88, 0x92, 0xf8, 0xe8,
-      0xeb, 0xb0, 0xce, 0x81, 0xe6, 0x8d, 0xea, 0xdd,
-      0x29, 0x0f, 0xdd, 0xce, 0xd0, 0x9d, 0xe7, 0xf1 },
     { 0x15, 0xcf, 0x2f, 0x78, 0xe6, 0x79, 0x62, 0x2c,
       0x06, 0x78, 0xdc, 0x5b, 0xa8, 0x03, 0x84, 0x7a,
       0xbd, 0xb5, 0xea, 0x64, 0x31, 0x65, 0x3e, 0xc2,
@@ -362,18 +330,10 @@
       0xfd, 0x9a, 0x79, 0xf2, 0xfb, 0xba, 0x9a, 0xca,
       0x46, 0xce, 0xad, 0x95, 0x43, 0x05, 0xfe, 0xe5,
       0xb1, 0x3b, 0x5d, 0x53, 0xdb, 0x7c, 0x1d, 0xb1 },
-    { 0x17, 0x29, 0xb3, 0x34, 0x7a, 0x7d, 0x93, 0x73,
-      0x17, 0xe3, 0xda, 0x5c, 0xc7, 0xf7, 0xb0, 0xd8,
-      0xfd, 0x97, 0x72, 0x24, 0x7a, 0x57, 0x99, 0x93,
-      0x9a, 0x44, 0xd3, 0xa9, 0x7a, 0x50, 0xb9, 0xd9 },
     { 0x17, 0x3d, 0xe2, 0x60, 0xe2, 0x2d, 0x76, 0x9d,
       0x2d, 0x54, 0x99, 0xc8, 0x22, 0x0d, 0x86, 0xed,
       0xe3, 0x48, 0xda, 0x1e, 0x57, 0xc1, 0xe7, 0xc8,
       0x15, 0x07, 0xfb, 0x3e, 0x6b, 0xd7, 0x3b, 0x7f },
-    { 0x17, 0x46, 0x68, 0x4e, 0x66, 0x21, 0x77, 0x68,
-      0x70, 0xde, 0x55, 0x65, 0xdf, 0xd3, 0x3a, 0x30,
-      0x92, 0x77, 0x18, 0x59, 0x6c, 0x01, 0x30, 0xf8,
-      0x77, 0x4b, 0xe9, 0x9c, 0xd2, 0xa2, 0x51, 0x06 },
     { 0x17, 0x59, 0x7e, 0x00, 0x45, 0x6c, 0x38, 0x32,
       0xe1, 0x85, 0x1c, 0x30, 0x0c, 0xd5, 0x52, 0xc2,
       0xe7, 0x73, 0x35, 0x8c, 0xf0, 0xf6, 0x88, 0x58,
@@ -442,10 +402,6 @@
       0x38, 0x5d, 0xe1, 0xde, 0x16, 0xb2, 0x22, 0x6e,
       0x88, 0x3d, 0x9c, 0x34, 0x66, 0x3e, 0x1b, 0x64,
       0xe8, 0x5b, 0x98, 0x0e, 0xaf, 0xf0, 0xb9, 0xd3 },
-    { 0x1c, 0x74, 0xba, 0x75, 0xe5, 0x1b, 0x48, 0x29,
-      0x54, 0xc3, 0x8b, 0xf4, 0xd5, 0x1e, 0xfc, 0x70,
-      0xa0, 0xa0, 0x4d, 0x41, 0x3a, 0xc1, 0xff, 0x8e,
-      0xb9, 0x90, 0x39, 0x9d, 0x1f, 0x1a, 0xa9, 0xc4 },
     { 0x1c, 0x76, 0xbb, 0xca, 0x37, 0x71, 0x77, 0x5b,
       0xb9, 0xb0, 0xc3, 0x33, 0x71, 0x70, 0x32, 0x69,
       0x06, 0x16, 0x77, 0xca, 0x7b, 0x18, 0x99, 0xef,
@@ -474,10 +430,6 @@
       0x85, 0xa7, 0x9b, 0xba, 0x45, 0xce, 0x76, 0x4b,
       0x2d, 0xa8, 0x1f, 0x99, 0x1f, 0x5f, 0x01, 0xd9,
       0xeb, 0x7e, 0x3c, 0x99, 0x9b, 0x78, 0x75, 0x0e },
-    { 0x1f, 0x7d, 0x37, 0x52, 0x93, 0x22, 0x7d, 0x04,
-      0x97, 0x5b, 0x78, 0x97, 0xdc, 0x17, 0x25, 0x39,
-      0x64, 0xdc, 0xd7, 0xd0, 0x06, 0x7e, 0x84, 0xc6,
-      0xd8, 0x47, 0x9d, 0xfa, 0x27, 0x6e, 0xbe, 0xd0 },
     { 0x1f, 0xc7, 0xf8, 0x10, 0x4e, 0x27, 0xff, 0x2a,
       0x45, 0x56, 0xf9, 0x1e, 0x05, 0x42, 0x17, 0xc5,
       0x8f, 0x69, 0x3f, 0x70, 0x36, 0x25, 0x9e, 0x39,
@@ -486,10 +438,6 @@
       0xcc, 0xd4, 0xe6, 0xad, 0xe1, 0xcb, 0x75, 0x13,
       0x8d, 0xd6, 0xd9, 0x06, 0xfe, 0xf3, 0x49, 0xc0,
       0xc9, 0x86, 0xa5, 0x1b, 0x29, 0xb9, 0xe5, 0x2d },
-    { 0x20, 0x15, 0x60, 0x8b, 0x8e, 0x86, 0xba, 0x63,
-      0x12, 0x01, 0xc2, 0x12, 0x20, 0x99, 0x57, 0xaf,
-      0xcb, 0x6e, 0xdf, 0x27, 0x22, 0xc6, 0x1b, 0x00,
-      0xe2, 0xfc, 0x92, 0x46, 0xa8, 0xd5, 0x20, 0x4e },
     { 0x20, 0xf1, 0x85, 0xbc, 0x7f, 0xa7, 0x61, 0x16,
       0x6e, 0xa3, 0xa9, 0x98, 0x8f, 0xb1, 0x0b, 0x24,
       0xc7, 0x01, 0xef, 0xdd, 0xab, 0xe4, 0x74, 0x05,
@@ -518,10 +466,6 @@
       0xf7, 0x8d, 0xa6, 0xc8, 0xb1, 0xd7, 0x2c, 0x3b,
       0xa8, 0x31, 0x9a, 0x46, 0xf8, 0x19, 0x2d, 0x1e,
       0x19, 0xb9, 0xe2, 0x9a, 0xba, 0x18, 0xee, 0x87 },
-    { 0x22, 0x2e, 0xc2, 0x75, 0xe6, 0x8a, 0x31, 0x7d,
-      0x60, 0x80, 0x67, 0x9d, 0xdf, 0x56, 0x78, 0x6a,
-      0xbd, 0x2b, 0x11, 0xf2, 0x5a, 0x17, 0x15, 0x33,
-      0xcf, 0xbd, 0x59, 0xee, 0x0d, 0xfa, 0x4e, 0xe4 },
     { 0x22, 0x7a, 0x2b, 0xff, 0xab, 0xde, 0xe1, 0x8c,
       0x2c, 0x54, 0xe6, 0xe9, 0xb5, 0x8a, 0xbd, 0xbf,
       0x93, 0x07, 0xa4, 0x06, 0x2e, 0xda, 0x97, 0xd4,
@@ -542,10 +486,6 @@
       0x16, 0x2a, 0x9c, 0xa0, 0x6e, 0x88, 0x01, 0xe1,
       0x19, 0xbd, 0xff, 0x54, 0x35, 0x4a, 0x3f, 0x68,
       0x43, 0xcf, 0x2a, 0x2f, 0xa6, 0x01, 0x75, 0x8e },
-    { 0x23, 0xf0, 0xdd, 0xd8, 0x9b, 0x42, 0x82, 0xa6,
-      0x7f, 0xd0, 0x57, 0x56, 0xfd, 0xc5, 0xd1, 0x8c,
-      0x1e, 0x5d, 0xcc, 0xef, 0xcf, 0x42, 0x65, 0x06,
-      0x6d, 0xfb, 0x4a, 0xbd, 0x30, 0xd9, 0xe9, 0x77 },
     { 0x23, 0xf7, 0xe4, 0xa3, 0x5b, 0xcc, 0xe7, 0x40,
       0x36, 0xd9, 0xc8, 0x6f, 0x7f, 0x61, 0x1d, 0x85,
       0xf3, 0x7c, 0xb6, 0x2c, 0x43, 0x24, 0x7d, 0x13,
@@ -570,10 +510,6 @@
       0x74, 0xe5, 0xe3, 0xd4, 0x3b, 0x27, 0xad, 0x66,
       0x62, 0x0b, 0x90, 0xcb, 0x91, 0x62, 0xc4, 0x68,
       0x5f, 0xa2, 0x6d, 0x85, 0xf5, 0xa4, 0x3a, 0xa0 },
-    { 0x25, 0x8c, 0x68, 0x91, 0xf0, 0x89, 0xb5, 0x09,
-      0x4b, 0xe3, 0x3d, 0x6c, 0x82, 0x21, 0x5e, 0x72,
-      0x65, 0xac, 0xa9, 0x3f, 0x7c, 0x9b, 0x41, 0x45,
-      0xd0, 0x8a, 0xff, 0x1f, 0x48, 0x30, 0x58, 0xaa },
     { 0x26, 0x03, 0xcb, 0xdf, 0x69, 0x75, 0xe3, 0x68,
       0x83, 0x7f, 0x95, 0x1a, 0x00, 0x49, 0xfd, 0xc3,
       0xc4, 0xb2, 0x39, 0xf0, 0x82, 0xf6, 0xbf, 0x89,
@@ -618,10 +554,6 @@
       0xe6, 0xa6, 0xa3, 0x5a, 0x9d, 0x40, 0x00, 0x0a,
       0x31, 0x8d, 0x7d, 0xdf, 0x5f, 0x5a, 0x2f, 0x4d,
       0x3d, 0x18, 0xbe, 0xba, 0xd3, 0x96, 0x91, 0xec },
-    { 0x29, 0x7a, 0xc8, 0x25, 0xc1, 0x98, 0x06, 0xfb,
-      0x88, 0x1f, 0xd9, 0x1c, 0x61, 0x2d, 0x6c, 0xc2,
-      0x1b, 0x28, 0xe4, 0xa5, 0x72, 0xcf, 0xb7, 0x16,
-      0x04, 0xe5, 0x54, 0x41, 0x4d, 0xfd, 0xea, 0xdc },
     { 0x29, 0xa8, 0x28, 0x26, 0x64, 0x3d, 0x5a, 0x98,
       0xc4, 0x7d, 0xf3, 0xa7, 0x8f, 0xbb, 0x84, 0x49,
       0xb3, 0xe6, 0xd3, 0xcc, 0xe6, 0x2c, 0xf4, 0x57,
@@ -630,18 +562,10 @@
       0x39, 0xa4, 0x04, 0xde, 0x35, 0xac, 0x84, 0xab,
       0x81, 0xaf, 0xec, 0x36, 0x17, 0xe7, 0xe1, 0xbf,
       0x34, 0x67, 0xd4, 0x19, 0x25, 0x5d, 0xd8, 0x17 },
-    { 0x2a, 0x6b, 0x9f, 0x6f, 0xdc, 0x43, 0xbf, 0x65,
-      0xe2, 0xa1, 0x0e, 0xde, 0x36, 0x64, 0xc8, 0x3f,
-      0xcb, 0xec, 0x13, 0x9a, 0x6e, 0x6c, 0xc5, 0xc8,
-      0x32, 0xd3, 0x27, 0x89, 0x5b, 0x52, 0x0e, 0xa2 },
     { 0x2a, 0xa6, 0x47, 0x8c, 0xc7, 0x5d, 0x67, 0xa8,
       0xca, 0x55, 0xb2, 0xe1, 0x63, 0xfd, 0xbb, 0xbc,
       0x9d, 0x74, 0xb4, 0xe5, 0xf3, 0x7b, 0x7d, 0xbd,
       0x13, 0xc9, 0x4e, 0x85, 0x8d, 0x40, 0xda, 0xd0 },
-    { 0x2a, 0xc0, 0x65, 0xae, 0x39, 0x6b, 0x87, 0x54,
-      0x9c, 0x3f, 0x09, 0xe5, 0x8f, 0x16, 0x4b, 0x24,
-      0x2e, 0xc5, 0x9d, 0x13, 0x92, 0xb1, 0xb2, 0x50,
-      0x14, 0xbf, 0x47, 0x94, 0xac, 0x13, 0x01, 0xb0 },
     { 0x2b, 0xf1, 0xe3, 0xf0, 0x37, 0x5a, 0x9a, 0x21,
       0xc0, 0x7a, 0x92, 0x18, 0x04, 0x2f, 0x18, 0x77,
       0x3f, 0x43, 0xea, 0xb0, 0xf5, 0xc0, 0x00, 0x26,
@@ -662,10 +586,6 @@
       0xc3, 0x73, 0x58, 0xcd, 0x5f, 0x71, 0xd1, 0x23,
       0xbb, 0x19, 0x77, 0x28, 0x85, 0x87, 0xc7, 0x3f,
       0x84, 0xb0, 0x8f, 0xf8, 0xaa, 0x01, 0x9a, 0x69 },
-    { 0x2d, 0xb5, 0x36, 0x48, 0xa6, 0x14, 0x69, 0x57,
-      0x01, 0xc7, 0xc5, 0x1e, 0x35, 0xff, 0x38, 0xd6,
-      0x4f, 0x27, 0xa2, 0x7d, 0x55, 0xdf, 0xf4, 0xb1,
-      0x4a, 0xc4, 0x50, 0xc7, 0x5e, 0xb1, 0x18, 0x6e },
     { 0x2d, 0xd5, 0xe6, 0xd3, 0x73, 0x36, 0x34, 0x2f,
       0x01, 0x1e, 0xb9, 0x7a, 0x2b, 0x77, 0x38, 0x9d,
       0xe6, 0xd2, 0x23, 0x8d, 0x87, 0x69, 0x65, 0x08,
@@ -674,10 +594,6 @@
       0xad, 0xe6, 0x7e, 0x9c, 0xa7, 0x05, 0xeb, 0xb4,
       0xc2, 0xe9, 0x40, 0xae, 0x1b, 0x9d, 0x62, 0x35,
       0x72, 0x18, 0x04, 0x58, 0x31, 0xe9, 0x8f, 0xde },
-    { 0x2e, 0x43, 0x2a, 0x54, 0x5d, 0xfe, 0x2d, 0xa3,
-      0xad, 0x00, 0xcc, 0x87, 0x89, 0x23, 0xa1, 0x85,
-      0xd6, 0xa3, 0xf9, 0x67, 0x5c, 0x36, 0xdc, 0x3c,
-      0xd3, 0x70, 0x2a, 0xef, 0xeb, 0x27, 0x0c, 0x85 },
     { 0x2e, 0x5d, 0xd2, 0x55, 0x09, 0x6d, 0x64, 0x83,
       0x10, 0x5c, 0xb6, 0x03, 0x6c, 0x59, 0x17, 0x57,
       0xfd, 0x98, 0x49, 0x70, 0x66, 0x05, 0x3f, 0x83,
@@ -690,10 +606,6 @@
       0x01, 0x7c, 0x6c, 0x79, 0x90, 0xe3, 0xf9, 0xa4,
       0x0d, 0x46, 0x9f, 0x76, 0x50, 0x59, 0x81, 0xc8,
       0x6f, 0x95, 0x55, 0x4f, 0x48, 0x7a, 0x52, 0x76 },
-    { 0x2f, 0x79, 0xd6, 0xf6, 0xa3, 0x2f, 0x1b, 0xee,
-      0x22, 0x37, 0xa0, 0x18, 0xe6, 0xae, 0xc4, 0xf4,
-      0x9e, 0x2c, 0x5c, 0x3c, 0xdb, 0xb6, 0x99, 0xe1,
-      0x6f, 0x8e, 0xf4, 0x14, 0xee, 0xff, 0x8d, 0xa3 },
     { 0x2f, 0xef, 0xa7, 0xcb, 0x12, 0x6b, 0x81, 0xc9,
       0x47, 0x4d, 0x3e, 0x2c, 0x9b, 0x97, 0x3a, 0x83,
       0x69, 0xbb, 0x08, 0x43, 0x41, 0xd3, 0x82, 0xd3,
@@ -718,10 +630,6 @@
       0x74, 0x2d, 0x6b, 0xe8, 0x40, 0x0a, 0xde, 0x51,
       0xb2, 0x09, 0x83, 0xf6, 0x83, 0xa2, 0xaa, 0xee,
       0xb2, 0x5f, 0x58, 0xdf, 0x98, 0x1b, 0xde, 0x0d },
-    { 0x31, 0xed, 0x8a, 0x8c, 0xc6, 0xee, 0x5e, 0x88,
-      0x4f, 0x21, 0x4f, 0x26, 0x7f, 0xe3, 0xa2, 0x27,
-      0xd4, 0xe6, 0xed, 0x36, 0xa7, 0x7f, 0xa2, 0x24,
-      0x6f, 0x0a, 0xd0, 0x77, 0x8a, 0x6b, 0x3f, 0x97 },
     { 0x32, 0x36, 0x98, 0x50, 0x9d, 0x8f, 0x8b, 0xfb,
       0xd4, 0xf9, 0x04, 0xbd, 0x1d, 0x84, 0x64, 0x12,
       0xc5, 0x27, 0xb7, 0x70, 0x06, 0x2a, 0xad, 0xdf,
@@ -742,10 +650,6 @@
       0xb9, 0xe6, 0x63, 0x0d, 0x9f, 0xe7, 0x1f, 0x17,
       0xb6, 0xc2, 0x25, 0xa6, 0x5c, 0x76, 0x08, 0x15,
       0xe4, 0x08, 0x74, 0x6c, 0x33, 0x1a, 0xb4, 0xf6 },
-    { 0x33, 0xc9, 0x15, 0x03, 0xbc, 0x7e, 0xbe, 0x5a,
-      0x5d, 0xd0, 0xcf, 0xbb, 0x37, 0x52, 0x64, 0xdd,
-      0x5a, 0x31, 0x1e, 0x48, 0xf4, 0x26, 0x6b, 0x32,
-      0x50, 0x8a, 0x02, 0x5d, 0x04, 0xfa, 0xdf, 0x38 },
     { 0x33, 0xd1, 0x6c, 0xd9, 0xe8, 0x2e, 0xdf, 0xfd,
       0x0b, 0x3a, 0xfb, 0x46, 0xa6, 0x84, 0xc5, 0xa0,
       0xd1, 0x2f, 0x2b, 0x40, 0x58, 0x6d, 0x53, 0x2f,
@@ -798,18 +702,10 @@
       0x44, 0xd6, 0xab, 0x39, 0xb7, 0xa8, 0x18, 0xf8,
       0x17, 0x6e, 0x65, 0x20, 0xdc, 0x86, 0x3d, 0xce,
       0x43, 0xb3, 0x98, 0xc3, 0x0b, 0x5e, 0xdb, 0x09 },
-    { 0x37, 0x07, 0x9d, 0x98, 0x72, 0x7c, 0x42, 0xa4,
-      0x1d, 0x66, 0x18, 0xfc, 0xcd, 0xc6, 0xff, 0xa1,
-      0x5e, 0xd3, 0xb2, 0xfe, 0xc7, 0xac, 0x0a, 0x09,
-      0x7b, 0x74, 0xc5, 0x72, 0xbb, 0xcd, 0xa8, 0xd7 },
     { 0x37, 0x87, 0x37, 0xcd, 0x85, 0x19, 0xba, 0xc5,
       0x32, 0x2f, 0xdb, 0x28, 0xf4, 0x4a, 0x43, 0xc5,
       0x09, 0xa5, 0x44, 0x7a, 0xd2, 0x68, 0x3b, 0xa1,
       0x90, 0x05, 0xe3, 0x1b, 0x0d, 0x54, 0x8c, 0x6d },
-    { 0x37, 0x99, 0x0f, 0x5b, 0x5c, 0x71, 0x11, 0x89,
-      0x98, 0xf9, 0xc8, 0xe1, 0x54, 0x65, 0x69, 0x16,
-      0x1a, 0x82, 0xbb, 0xfb, 0x4b, 0x4f, 0xc4, 0xca,
-      0xa3, 0xf4, 0xb7, 0xe7, 0x4a, 0xf5, 0x15, 0xfe },
     { 0x37, 0xc9, 0x7a, 0x48, 0xf5, 0xee, 0x3e, 0x68,
       0xcc, 0x24, 0xb5, 0x4e, 0x7c, 0x4d, 0x9f, 0x91,
       0xc7, 0xd1, 0x8b, 0x8d, 0xb6, 0x1e, 0x04, 0xee,
@@ -846,10 +742,6 @@
       0x82, 0xd5, 0x85, 0xd5, 0xe0, 0x82, 0xc4, 0xb3,
       0xad, 0x03, 0xcd, 0xb6, 0xb5, 0x05, 0xca, 0x80,
       0x47, 0x19, 0x88, 0xec, 0x4c, 0x58, 0x99, 0x9e },
-    { 0x3a, 0xd4, 0x7c, 0xb3, 0x47, 0x3f, 0x59, 0x51,
-      0x5b, 0xac, 0x6a, 0xfa, 0x30, 0x44, 0x8f, 0xb9,
-      0x5d, 0x7f, 0x4b, 0xf1, 0x14, 0x48, 0x53, 0x87,
-      0xd0, 0x4c, 0x50, 0x15, 0x19, 0xbb, 0x77, 0xc3 },
     { 0x3a, 0xea, 0x2c, 0xef, 0xae, 0x63, 0x44, 0xff,
       0xae, 0x67, 0x49, 0x4c, 0x68, 0x4e, 0x1e, 0xbf,
       0x87, 0x95, 0x40, 0xb5, 0x3d, 0x40, 0xf5, 0x16,
@@ -858,10 +750,6 @@
       0xca, 0x6c, 0x31, 0xb3, 0x78, 0x39, 0xc9, 0x50,
       0x76, 0x63, 0x70, 0xd7, 0xf4, 0xb6, 0x4a, 0xd0,
       0x18, 0x55, 0xca, 0xcf, 0xe3, 0x51, 0x2f, 0xc3 },
-    { 0x3b, 0x4a, 0x9f, 0x55, 0x6c, 0xca, 0xc7, 0x0c,
-      0xa1, 0xf3, 0x3a, 0xf6, 0xde, 0xcc, 0x66, 0xca,
-      0xfd, 0x2d, 0x30, 0x1d, 0x49, 0x7b, 0x49, 0x0b,
-      0x30, 0x80, 0x46, 0x35, 0xba, 0xd2, 0x56, 0x94 },
     { 0x3b, 0x6e, 0x3b, 0xb7, 0x00, 0x04, 0xbd, 0x78,
       0xc9, 0x69, 0xa7, 0xfb, 0xd5, 0x11, 0x33, 0xa2,
       0xb3, 0xc4, 0xdf, 0xb6, 0xba, 0x38, 0x5d, 0xce,
@@ -890,22 +778,10 @@
       0xf8, 0x91, 0x85, 0x31, 0xa7, 0x7c, 0xf9, 0xbf,
       0x5c, 0xa1, 0x85, 0x0c, 0x82, 0x02, 0x69, 0xd7,
       0xb2, 0xc8, 0xec, 0xd0, 0x54, 0x3a, 0x61, 0x65 },
-    { 0x3e, 0x6f, 0x37, 0x53, 0xf1, 0xab, 0x10, 0x62,
-      0x60, 0xdb, 0xef, 0xa6, 0x8e, 0xc5, 0x85, 0x01,
-      0x29, 0x1d, 0x1e, 0xb4, 0x00, 0x28, 0x8f, 0x06,
-      0xed, 0xf2, 0x9f, 0x8f, 0x8f, 0x66, 0xb0, 0x1a },
     { 0x3e, 0x8e, 0x9b, 0xad, 0x8e, 0xd9, 0xb5, 0x72,
       0x38, 0x2e, 0x59, 0x8d, 0x2d, 0x73, 0x67, 0xe1,
       0xfd, 0x6a, 0xf6, 0x95, 0x25, 0x00, 0x9d, 0x67,
       0xb4, 0xe8, 0xaf, 0x80, 0xd9, 0x15, 0x85, 0x49 },
-    { 0x3e, 0xc1, 0xc3, 0x43, 0xc6, 0x60, 0x05, 0x10,
-      0x57, 0x97, 0x47, 0xa7, 0x1a, 0xea, 0xb3, 0x04,
-      0x1a, 0x71, 0x8e, 0x4f, 0xc6, 0xe2, 0x96, 0xfe,
-      0xb7, 0x50, 0xa3, 0x12, 0x38, 0x72, 0x6e, 0xa5 },
-    { 0x3e, 0xd6, 0x85, 0x47, 0x65, 0x07, 0x91, 0x35,
-      0xaa, 0xee, 0xb7, 0xd8, 0xa3, 0x79, 0x17, 0xdc,
-      0x71, 0x74, 0x5e, 0xa6, 0x0f, 0xa9, 0x62, 0x1b,
-      0xaa, 0x30, 0x7f, 0xbe, 0x71, 0xa7, 0x3c, 0x43 },
     { 0x3f, 0x27, 0xbd, 0xca, 0x9b, 0x0e, 0x42, 0xf3,
       0xf6, 0xd0, 0x91, 0x2c, 0x92, 0xe2, 0xda, 0x65,
       0xcb, 0x35, 0x8f, 0x0b, 0x8f, 0x80, 0x5b, 0xec,
@@ -938,10 +814,6 @@
       0x65, 0xa7, 0x39, 0xa0, 0x0c, 0x85, 0xf3, 0x44,
       0x58, 0x79, 0xd6, 0x5e, 0x1d, 0x42, 0x2e, 0xed,
       0x07, 0x65, 0x5a, 0x8e, 0x3e, 0xc3, 0x18, 0xcf },
-    { 0x41, 0x1e, 0x5a, 0x18, 0x2a, 0x48, 0x3c, 0x67,
-      0x0f, 0x89, 0xac, 0xee, 0xa6, 0xda, 0xa1, 0xf9,
-      0xa6, 0x22, 0x7e, 0xdf, 0x04, 0x9c, 0x05, 0xe3,
-      0xc4, 0xcf, 0xf7, 0x28, 0x42, 0x45, 0x9a, 0xa2 },
     { 0x41, 0x29, 0x6b, 0x9f, 0xaa, 0xd6, 0x41, 0x33,
       0xfc, 0xcb, 0xa6, 0xba, 0x74, 0x54, 0x11, 0xec,
       0xc9, 0x11, 0xfd, 0x8e, 0xd5, 0x41, 0x90, 0x0f,
@@ -990,14 +862,6 @@
       0x4a, 0x58, 0x1f, 0x4f, 0x10, 0x91, 0xab, 0xef,
       0x33, 0x2d, 0x8a, 0x7c, 0xef, 0x60, 0xe6, 0x8d,
       0xaf, 0x84, 0x13, 0x23, 0x26, 0x12, 0x90, 0xf0 },
-    { 0x44, 0xc2, 0x00, 0x2e, 0xea, 0xbe, 0x55, 0xaa,
-      0x9b, 0xf9, 0x7c, 0xf3, 0xef, 0xd4, 0xfb, 0x06,
-      0xec, 0xe5, 0x10, 0xb4, 0xab, 0xe9, 0xac, 0xb8,
-      0x2c, 0x36, 0xef, 0x23, 0x5b, 0x9d, 0xc8, 0xa1 },
-    { 0x45, 0x60, 0xdb, 0xdb, 0x1c, 0x43, 0x68, 0x50,
-      0xef, 0xb0, 0x03, 0x1e, 0xf8, 0x2b, 0x9f, 0x70,
-      0x88, 0x21, 0x9e, 0xce, 0xd2, 0x69, 0x56, 0x1f,
-      0xb4, 0xd1, 0xb0, 0x18, 0x3c, 0x44, 0xc2, 0xb5 },
     { 0x45, 0x63, 0xcf, 0x13, 0xc2, 0x49, 0x2c, 0xaa,
       0x92, 0xf5, 0x5b, 0x17, 0x26, 0x3a, 0xdd, 0x72,
       0x04, 0xa8, 0x0f, 0xe6, 0x24, 0x0c, 0x4d, 0x63,
@@ -1010,10 +874,6 @@
       0xd5, 0xda, 0xfc, 0x05, 0xeb, 0x0c, 0x53, 0x65,
       0x82, 0x3a, 0x91, 0xa9, 0x8b, 0x7d, 0xbe, 0x81,
       0xab, 0x5f, 0x17, 0x8b, 0x2d, 0xa4, 0xad, 0x9e },
-    { 0x45, 0xcc, 0x74, 0xa3, 0xdb, 0xcb, 0x59, 0xa1,
-      0x35, 0x35, 0x39, 0xfa, 0x5b, 0x1a, 0xf9, 0x74,
-      0x6b, 0xa5, 0xc7, 0xf0, 0xf1, 0x6f, 0x7c, 0xc1,
-      0xf7, 0x0c, 0x71, 0x32, 0x38, 0x82, 0x7e, 0x37 },
     { 0x46, 0x9b, 0xd8, 0x04, 0xe9, 0x98, 0xae, 0x27,
       0x9a, 0xc3, 0xfe, 0x1b, 0x52, 0x88, 0x46, 0xe7,
       0xae, 0xc7, 0x6c, 0x56, 0xb8, 0x0b, 0x40, 0xf3,
@@ -1034,18 +894,6 @@
       0x8b, 0xf5, 0xdd, 0xa4, 0xc3, 0xe9, 0x9e, 0x7f,
       0xa3, 0x10, 0x9b, 0x67, 0xbd, 0x0c, 0x9b, 0x1f,
       0x40, 0x75, 0x96, 0x65, 0xb9, 0xec, 0x3f, 0xf2 },
-    { 0x48, 0x09, 0x80, 0xfc, 0xeb, 0x50, 0xeb, 0x37,
-      0x4c, 0x91, 0x6c, 0xb2, 0xa4, 0x3a, 0xfb, 0xd5,
-      0x35, 0x21, 0x1a, 0xea, 0x9b, 0x12, 0xb7, 0xa4,
-      0x5a, 0xaf, 0x90, 0xba, 0x9c, 0xa4, 0x70, 0x0f },
-    { 0x48, 0x4b, 0x8b, 0xc1, 0xe6, 0xcb, 0xba, 0x3f,
-      0x01, 0xf7, 0xa9, 0x34, 0x5a, 0x88, 0x4c, 0xf5,
-      0xf1, 0x5d, 0x82, 0xda, 0x56, 0x98, 0xb6, 0xb3,
-      0x71, 0xe4, 0xdc, 0x6b, 0xbd, 0x6c, 0x8a, 0xe8 },
-    { 0x48, 0x5c, 0xf2, 0xb0, 0xa5, 0xe6, 0x9a, 0x0a,
-      0x9a, 0xab, 0x03, 0xff, 0x82, 0xbd, 0x6b, 0x7b,
-      0x2e, 0xdf, 0x8e, 0x1b, 0x54, 0x45, 0x8e, 0x14,
-      0x2a, 0xeb, 0x88, 0xba, 0xa8, 0x84, 0x0e, 0x5b },
     { 0x48, 0xc5, 0xd4, 0xff, 0x5d, 0x08, 0x4a, 0xc1,
       0x95, 0xb1, 0xa6, 0xa2, 0x19, 0xf8, 0x1b, 0xbd,
       0xf9, 0xd2, 0xe5, 0xc0, 0x70, 0xec, 0x97, 0xdf,
@@ -1126,10 +974,6 @@
       0xa9, 0xaa, 0x3b, 0x7b, 0x02, 0x7d, 0x71, 0x4c,
       0x0f, 0x76, 0x07, 0xc3, 0x56, 0x73, 0x3b, 0xa2,
       0x21, 0xaa, 0xe4, 0x09, 0x47, 0xf7, 0xfa, 0xcb },
-    { 0x4d, 0x25, 0x2e, 0x6e, 0x1a, 0x15, 0x9a, 0xc2,
-      0x22, 0xb3, 0x2e, 0x9d, 0xd0, 0x31, 0x56, 0x7b,
-      0x69, 0x31, 0x4b, 0xe8, 0xe8, 0x21, 0x1c, 0x1f,
-      0xb3, 0xc8, 0xb5, 0x3c, 0x26, 0x0a, 0x74, 0xe5 },
     { 0x4d, 0x54, 0x4d, 0x4e, 0x41, 0xc0, 0xfb, 0x15,
       0x5f, 0x04, 0x7d, 0x7f, 0xb1, 0xef, 0x29, 0xd1,
       0x1b, 0xdf, 0xec, 0xa9, 0xd4, 0x11, 0xaf, 0x8b,
@@ -1142,18 +986,10 @@
       0x81, 0x79, 0x67, 0x53, 0xdd, 0x20, 0x20, 0xb1,
       0x10, 0x54, 0x09, 0x32, 0xf7, 0x4f, 0x97, 0x41,
       0xd9, 0x6c, 0x1d, 0xb9, 0x50, 0x5d, 0x5f, 0xf1 },
-    { 0x4e, 0x33, 0x78, 0xec, 0x23, 0x7c, 0x01, 0xa3,
-      0xcd, 0x85, 0x9e, 0x1d, 0xc9, 0x29, 0xd6, 0xa6,
-      0xef, 0xb6, 0x36, 0x7a, 0x72, 0x58, 0x41, 0xcf,
-      0x54, 0x13, 0x25, 0xc0, 0x61, 0xf8, 0xbf, 0xd4 },
     { 0x4e, 0x48, 0xc1, 0x6c, 0x9d, 0x0d, 0xe5, 0xdd,
       0x8c, 0x9c, 0x36, 0x37, 0x35, 0xdd, 0xfb, 0xc3,
       0xdb, 0xd2, 0x6e, 0xa0, 0xae, 0xcd, 0xe1, 0xc7,
       0x62, 0xbb, 0x56, 0xbb, 0x3f, 0xe4, 0xfa, 0x74 },
-    { 0x4e, 0x6e, 0x0a, 0x27, 0x52, 0x69, 0x22, 0x88,
-      0x98, 0x02, 0xb5, 0x98, 0x9e, 0xf0, 0x8a, 0xe1,
-      0x67, 0x02, 0x62, 0x0e, 0x8d, 0x12, 0x90, 0xb9,
-      0x36, 0x9e, 0xf0, 0x32, 0x9a, 0xdb, 0xa6, 0x8c },
     { 0x4f, 0x19, 0xdd, 0x12, 0x92, 0x4c, 0xe0, 0xc1,
       0x4f, 0x82, 0xc0, 0x56, 0xc7, 0xd4, 0x2b, 0xac,
       0x43, 0xd0, 0x13, 0x3a, 0xaf, 0x89, 0xc1, 0xef,
@@ -1234,10 +1070,6 @@
       0x08, 0x60, 0x96, 0x78, 0xc4, 0x3b, 0xdd, 0xab,
       0x90, 0x28, 0xba, 0x6c, 0x17, 0x68, 0x4c, 0x51,
       0x22, 0x42, 0x62, 0x43, 0xcb, 0x61, 0x2a, 0x29 },
-    { 0x53, 0xed, 0x84, 0xe5, 0xc9, 0xad, 0x2b, 0xd1,
-      0xcb, 0x2c, 0xc8, 0x36, 0x52, 0xea, 0x0c, 0xc3,
-      0x71, 0xcd, 0x53, 0x4b, 0xd5, 0x97, 0xce, 0x7e,
-      0x07, 0x37, 0xa0, 0xab, 0x10, 0x65, 0x73, 0xaa },
     { 0x54, 0x41, 0xfb, 0xb0, 0x5d, 0x6d, 0x4a, 0xed,
       0xe0, 0x3b, 0x48, 0x2f, 0x51, 0x95, 0x1c, 0x7e,
       0xf0, 0x73, 0x45, 0x53, 0xce, 0xc7, 0x80, 0xfb,
@@ -1262,10 +1094,6 @@
       0x58, 0x4d, 0x9e, 0x7b, 0x57, 0x92, 0xa4, 0x03,
       0xc2, 0x1d, 0x39, 0xd6, 0xe1, 0xf5, 0xe8, 0xed,
       0x37, 0xb9, 0x3f, 0xa6, 0x1d, 0x88, 0x35, 0x16 },
-    { 0x56, 0x65, 0xc2, 0xe5, 0x64, 0x33, 0x29, 0x85,
-      0xb8, 0xd2, 0xc4, 0xfb, 0x61, 0x14, 0x57, 0xd8,
-      0xd5, 0x65, 0x9a, 0xe0, 0x05, 0x87, 0x4c, 0x6f,
-      0x30, 0x34, 0xd2, 0x9f, 0x2a, 0x9a, 0x78, 0x32 },
     { 0x56, 0x96, 0x18, 0xd5, 0x4e, 0x3c, 0x61, 0x1b,
       0x79, 0x7e, 0xeb, 0x01, 0xdf, 0x9c, 0x1c, 0x5c,
       0x14, 0x6d, 0x87, 0xb3, 0xb1, 0x29, 0xba, 0x42,
@@ -1282,10 +1110,6 @@
       0x62, 0x9c, 0x3c, 0x7c, 0x78, 0xef, 0xbe, 0xf2,
       0x75, 0x06, 0x56, 0x65, 0xb2, 0x41, 0x1c, 0x0e,
       0x5f, 0xcf, 0xbc, 0x7e, 0xb4, 0xbe, 0x34, 0x0b },
-    { 0x58, 0x36, 0x98, 0x46, 0xc0, 0x25, 0x15, 0x0e,
-      0xcf, 0xb2, 0x2c, 0xce, 0xb8, 0xe4, 0xde, 0x9a,
-      0xc3, 0xd0, 0x2d, 0x9e, 0x23, 0x6c, 0x02, 0xef,
-      0xb5, 0x5f, 0x63, 0xeb, 0xaf, 0xea, 0xf7, 0x5b },
     { 0x59, 0x43, 0x09, 0x51, 0x02, 0x8b, 0x87, 0x78,
       0x01, 0x67, 0xc9, 0x56, 0x47, 0x9a, 0x81, 0x5f,
       0x91, 0xbc, 0x6c, 0x00, 0xc2, 0xe5, 0x0c, 0x35,
@@ -1378,10 +1202,6 @@
       0x79, 0x92, 0xc5, 0x8f, 0xac, 0x32, 0xe3, 0x0c,
       0x01, 0x9e, 0xaf, 0x41, 0xe0, 0xb3, 0x85, 0x7e,
       0xa9, 0x00, 0xa1, 0x61, 0x08, 0xeb, 0x34, 0xde },
-    { 0x60, 0x28, 0x6b, 0x5f, 0xb1, 0xa4, 0x7f, 0x8c,
-      0x79, 0x3e, 0xbe, 0x0a, 0x4f, 0x9e, 0xa0, 0xef,
-      0xb6, 0xff, 0xf7, 0xd0, 0x1c, 0x79, 0x10, 0xef,
-      0xf7, 0x4e, 0xd3, 0xb2, 0x88, 0xf4, 0xe6, 0x27 },
     { 0x60, 0xca, 0x81, 0xe3, 0x5b, 0x9a, 0x6f, 0x07,
       0xe1, 0x3c, 0x02, 0xae, 0x41, 0x15, 0xb0, 0x00,
       0x54, 0x30, 0xcf, 0x46, 0x0e, 0xfc, 0x7d, 0xba,
@@ -1406,18 +1226,10 @@
       0x4d, 0xf9, 0x1e, 0x31, 0x32, 0x2e, 0x57, 0x74,
       0x69, 0x1e, 0x0c, 0x41, 0xfa, 0x0d, 0x2f, 0x25,
       0x7a, 0xd7, 0xf9, 0xf0, 0x25, 0x98, 0x14, 0x45 },
-    { 0x63, 0x65, 0xeb, 0x4e, 0x37, 0xea, 0x23, 0x8b,
-      0xbc, 0x40, 0xa7, 0x65, 0x1e, 0xdd, 0x9a, 0x1c,
-      0x65, 0xfc, 0x54, 0xe3, 0xb8, 0x8f, 0xa7, 0xa0,
-      0x6d, 0x92, 0xc6, 0x13, 0xae, 0xde, 0xd6, 0x5d },
     { 0x63, 0x6a, 0x25, 0xbd, 0xdb, 0xb6, 0x5e, 0x7c,
       0xc0, 0xe6, 0x1f, 0x91, 0xca, 0xfe, 0xb1, 0xfe,
       0x5d, 0xd2, 0x67, 0xac, 0x67, 0x32, 0x25, 0xcc,
       0x81, 0x8e, 0xa0, 0x2b, 0x9c, 0xc9, 0x4b, 0xe2 },
-    { 0x64, 0x87, 0xc9, 0x20, 0xb1, 0x30, 0x16, 0xf4,
-      0xa0, 0xaa, 0xd3, 0x9f, 0xe1, 0x97, 0x8b, 0xec,
-      0xe9, 0xf4, 0xfa, 0x13, 0xed, 0x0c, 0x42, 0x4d,
-      0xaa, 0x41, 0x6b, 0xaa, 0x75, 0x89, 0x62, 0x01 },
     { 0x64, 0xd4, 0x92, 0x41, 0x6e, 0xe0, 0x55, 0x57,
       0x9c, 0x46, 0x3b, 0x21, 0x1a, 0xfe, 0xf7, 0x46,
       0xc3, 0x30, 0xca, 0x05, 0xf4, 0x4d, 0x85, 0x90,
@@ -1434,10 +1246,6 @@
       0x38, 0x07, 0x1a, 0xee, 0xde, 0xf8, 0xe1, 0x83,
       0xe2, 0x37, 0x38, 0x46, 0x97, 0x26, 0xeb, 0x99,
       0x68, 0x0c, 0xd2, 0x44, 0x72, 0x73, 0x6b, 0xec },
-    { 0x66, 0x49, 0xe0, 0x34, 0xc6, 0x9d, 0x14, 0x24,
-      0xd2, 0x8c, 0x42, 0x68, 0xba, 0x95, 0x1e, 0xe1,
-      0xb4, 0x8a, 0xe1, 0x5f, 0xeb, 0xe7, 0xd6, 0xbe,
-      0x9d, 0x75, 0xf6, 0xa4, 0xac, 0x7a, 0xc2, 0x53 },
     { 0x66, 0x50, 0xb2, 0xea, 0x64, 0x4c, 0x3f, 0x4e,
       0x8c, 0x9e, 0x3c, 0x46, 0xac, 0xea, 0xc4, 0x52,
       0x33, 0xd8, 0x66, 0xe3, 0x98, 0xff, 0x90, 0xeb,
@@ -1566,14 +1374,6 @@
       0x8c, 0xc5, 0x2a, 0x48, 0x0a, 0xc0, 0x6d, 0x69,
       0x71, 0xc5, 0xa3, 0xda, 0x97, 0xcf, 0x3e, 0xf0,
       0x1a, 0xf2, 0x9d, 0x74, 0x72, 0x62, 0x31, 0xe2 },
-    { 0x6e, 0xb8, 0xa7, 0xba, 0x7f, 0xc2, 0x1c, 0x62,
-      0x40, 0x3f, 0x63, 0x76, 0xbb, 0x10, 0x44, 0x82,
-      0x48, 0x8d, 0xa9, 0xc1, 0x41, 0x4a, 0xe3, 0xab,
-      0x06, 0xe0, 0x1e, 0xd7, 0x32, 0x42, 0xab, 0xd7 },
-    { 0x6e, 0xeb, 0x39, 0xda, 0xd7, 0x3f, 0xc5, 0x99,
-      0x72, 0x42, 0x17, 0xcf, 0xf0, 0x21, 0xd5, 0xac,
-      0x4e, 0x7e, 0x2b, 0xf4, 0x76, 0xea, 0xf4, 0xfd,
-      0x4d, 0x7b, 0xfb, 0x6e, 0x4f, 0x18, 0xc1, 0x73 },
     { 0x6f, 0x3b, 0xb3, 0x4b, 0x5d, 0x32, 0x91, 0xdf,
       0xb3, 0xe4, 0x12, 0x71, 0xa1, 0xd7, 0x30, 0xcd,
       0xbc, 0xff, 0xc1, 0x0b, 0x68, 0x05, 0x9d, 0xcc,
@@ -1622,10 +1422,6 @@
       0x0e, 0xdf, 0xa3, 0x41, 0x1f, 0xbc, 0x9b, 0xad,
       0x31, 0x65, 0xbe, 0x66, 0x0f, 0x34, 0x0a, 0xa2,
       0x30, 0x8a, 0x5a, 0x33, 0x23, 0xfa, 0xbf, 0xa7 },
-    { 0x73, 0x46, 0x99, 0x89, 0x4a, 0xd4, 0xb5, 0xa8,
-      0xa2, 0xdd, 0x9a, 0xb4, 0xfd, 0x5f, 0x63, 0x25,
-      0x30, 0x3b, 0x49, 0x16, 0x4c, 0xa8, 0xd8, 0xe7,
-      0xba, 0x99, 0x77, 0x81, 0x7e, 0x4a, 0xe2, 0x4f },
     { 0x73, 0x9d, 0x17, 0x23, 0x23, 0xf2, 0xb2, 0x84,
       0x07, 0x0a, 0xce, 0x43, 0x09, 0x8c, 0x8b, 0x21,
       0xc4, 0x7a, 0x53, 0xf9, 0x98, 0x5f, 0x2f, 0xad,
@@ -1646,10 +1442,6 @@
       0x00, 0xb4, 0x14, 0x73, 0xca, 0x44, 0xe6, 0x87,
       0x96, 0x38, 0x74, 0x3d, 0x8f, 0xee, 0x66, 0xee,
       0x71, 0x8c, 0x18, 0xd8, 0xf1, 0x12, 0x15, 0xd1 },
-    { 0x75, 0xbb, 0x15, 0x25, 0x09, 0xb7, 0x19, 0x04,
-      0xe4, 0x40, 0x0f, 0xb4, 0x23, 0xa5, 0x80, 0xaa,
-      0xe1, 0xdd, 0xb7, 0x68, 0xf6, 0xfd, 0x36, 0xe6,
-      0x30, 0x94, 0xeb, 0xe3, 0x92, 0x15, 0xf3, 0x90 },
     { 0x75, 0xe9, 0xa1, 0x5d, 0x94, 0x88, 0x0c, 0x66,
       0x14, 0x82, 0xcf, 0xc1, 0x96, 0x4c, 0xbc, 0xe2,
       0xb1, 0xca, 0x7a, 0x9f, 0x81, 0xd4, 0x07, 0x30,
@@ -1666,10 +1458,6 @@
       0x83, 0x98, 0x71, 0x0f, 0x02, 0x20, 0xfa, 0xf3,
       0x30, 0x1d, 0x54, 0x49, 0x38, 0xfb, 0x24, 0x19,
       0x2d, 0xec, 0x32, 0xf7, 0x44, 0xe4, 0x22, 0x10 },
-    { 0x76, 0xcd, 0xf0, 0x78, 0xa8, 0x89, 0x1f, 0x1b,
-      0x3d, 0x0a, 0xa7, 0x1d, 0x6e, 0x18, 0xd7, 0x6a,
-      0x4d, 0x20, 0x7a, 0xaf, 0x84, 0xc6, 0x12, 0x95,
-      0x0e, 0xdf, 0xcd, 0x92, 0x82, 0xa1, 0x11, 0x44 },
     { 0x77, 0x95, 0x6b, 0x48, 0xcd, 0xd9, 0x15, 0x0b,
       0xd8, 0x7d, 0x8d, 0x81, 0x50, 0x60, 0xac, 0x8c,
       0x84, 0x81, 0x3a, 0x53, 0x87, 0x1a, 0x58, 0x6a,
@@ -1682,10 +1470,6 @@
       0x7e, 0xd5, 0x33, 0xc9, 0x9c, 0xc8, 0x25, 0x08,
       0xeb, 0xa6, 0xac, 0x3a, 0x0b, 0xe5, 0xbc, 0xbf,
       0x7a, 0xc9, 0x94, 0x95, 0x2b, 0x6d, 0x35, 0x07 },
-    { 0x77, 0xb9, 0x6a, 0x00, 0x77, 0x15, 0xa0, 0x8c,
-      0x6a, 0x22, 0xdb, 0x14, 0xc7, 0xf4, 0xf1, 0xd7,
-      0xf4, 0xa7, 0x41, 0xce, 0x47, 0x32, 0xec, 0xf8,
-      0x3e, 0x74, 0xc1, 0xc9, 0x63, 0x22, 0x83, 0xcd },
     { 0x77, 0xdd, 0xc8, 0x1b, 0xd2, 0x8b, 0x9d, 0x46,
       0x1e, 0x7d, 0x3c, 0xd4, 0xa8, 0x12, 0x2a, 0xa9,
       0x8a, 0x24, 0x60, 0xfb, 0xa0, 0x8f, 0x1b, 0x7b,
@@ -1746,14 +1530,6 @@
       0xf8, 0xa9, 0xb4, 0xd9, 0x8e, 0xa2, 0x9a, 0xe4,
       0xa5, 0xa4, 0x24, 0x72, 0xf5, 0x91, 0xca, 0x11,
       0xfb, 0x5e, 0x11, 0x21, 0x06, 0x28, 0x63, 0x96 },
-    { 0x7c, 0x63, 0xb8, 0x8e, 0x58, 0x19, 0x07, 0x0f,
-      0xc1, 0x4a, 0xdb, 0x67, 0xd6, 0xda, 0xa1, 0x29,
-      0x83, 0x14, 0x30, 0x4a, 0x9c, 0x05, 0x30, 0x18,
-      0x02, 0x7d, 0xf8, 0x36, 0x91, 0x4d, 0x73, 0xd4 },
-    { 0x7c, 0xa0, 0x86, 0x8b, 0xeb, 0xae, 0x8a, 0xca,
-      0x9d, 0x0f, 0x75, 0x38, 0x65, 0xc3, 0x2a, 0x0d,
-      0x2d, 0xd4, 0xf1, 0x48, 0x6e, 0x37, 0x34, 0xa6,
-      0xa3, 0x71, 0x0e, 0xcc, 0x3e, 0x57, 0xf9, 0xed },
     { 0x7c, 0xf9, 0x2f, 0x75, 0xbb, 0xe7, 0xa1, 0x4d,
       0x86, 0x93, 0xf9, 0x93, 0xc3, 0xd1, 0xa6, 0x08,
       0xdb, 0xe0, 0xd1, 0x8f, 0x80, 0x8e, 0x21, 0x2d,
@@ -1766,10 +1542,6 @@
       0xdd, 0xd6, 0x03, 0xb1, 0x75, 0xc9, 0xb2, 0x05,
       0xac, 0x0b, 0x55, 0x3a, 0x4b, 0xf5, 0xfb, 0x08,
       0xc2, 0x46, 0xec, 0xf9, 0xc8, 0x49, 0xdb, 0x28 },
-    { 0x7f, 0x86, 0xd3, 0xaa, 0x7e, 0xa7, 0x5c, 0x18,
-      0x03, 0x9d, 0x6a, 0xf9, 0x9c, 0xef, 0x75, 0x04,
-      0xce, 0x7b, 0x05, 0x05, 0x9b, 0xbf, 0xe7, 0x3f,
-      0xcd, 0xec, 0xfc, 0x71, 0xb2, 0x53, 0x8d, 0x72 },
     { 0x7f, 0x95, 0x9b, 0x06, 0x34, 0xda, 0x94, 0xfa,
       0xca, 0xda, 0xb0, 0x21, 0xcf, 0x94, 0x20, 0x78,
       0x16, 0x00, 0x36, 0x13, 0xef, 0x09, 0xeb, 0x54,
@@ -1834,10 +1606,6 @@
       0x95, 0xe2, 0x5f, 0x91, 0xa5, 0xfb, 0x0f, 0x2a,
       0xfc, 0xba, 0x7e, 0x09, 0xb2, 0x17, 0x27, 0xee,
       0xd8, 0x13, 0x0c, 0xde, 0x8f, 0x08, 0x0f, 0xca },
-    { 0x82, 0xd1, 0x9b, 0xd8, 0x0a, 0x88, 0x6b, 0x28,
-      0x61, 0xc3, 0x09, 0x97, 0x4c, 0x1c, 0x99, 0x3d,
-      0xbe, 0xc3, 0x7e, 0x30, 0x85, 0xc1, 0x47, 0xc4,
-      0x1f, 0x23, 0xd9, 0xf1, 0x20, 0xd8, 0x9b, 0x68 },
     { 0x82, 0xe1, 0xbd, 0xb3, 0xdc, 0x4f, 0x02, 0x36,
       0x3a, 0x79, 0x6b, 0x60, 0xa8, 0x8e, 0x4e, 0x71,
       0xbd, 0x33, 0xb0, 0xbe, 0x4c, 0xc5, 0xb8, 0x33,
@@ -1866,10 +1634,6 @@
       0xcf, 0x81, 0xb7, 0xd5, 0xff, 0x51, 0xa7, 0xa5,
       0x6a, 0x84, 0x78, 0x3a, 0x2d, 0xf7, 0x43, 0x61,
       0xff, 0x2e, 0xee, 0x0f, 0x92, 0x12, 0xc1, 0x59 },
-    { 0x84, 0x26, 0xbc, 0x06, 0xdb, 0xb5, 0x18, 0x71,
-      0x34, 0x66, 0xc7, 0x6a, 0xea, 0x52, 0x1b, 0xce,
-      0x39, 0xd3, 0x91, 0xa8, 0x89, 0xcb, 0xba, 0x9b,
-      0x7b, 0x72, 0xdc, 0xda, 0x89, 0xf3, 0x46, 0x55 },
     { 0x84, 0x7b, 0x5f, 0x1e, 0xeb, 0x2a, 0x44, 0x13,
       0xc8, 0xfa, 0x37, 0x98, 0x21, 0x97, 0x37, 0xe1,
       0x92, 0xba, 0x72, 0x72, 0xa1, 0x08, 0xb7, 0x17,
@@ -1914,14 +1678,6 @@
       0xe8, 0x1c, 0x27, 0xd1, 0xca, 0xf2, 0x74, 0xb1,
       0x7d, 0x72, 0x0d, 0xf8, 0x07, 0x8b, 0x6f, 0x2a,
       0x5c, 0x3b, 0xb8, 0xd8, 0xdf, 0xf0, 0x55, 0x00 },
-    { 0x87, 0xeb, 0xcb, 0xb0, 0x73, 0x7a, 0xe3, 0x27,
-      0xc6, 0xbe, 0x9d, 0x3f, 0xa2, 0xc7, 0x5d, 0x1e,
-      0xea, 0x0a, 0xe6, 0x6d, 0x20, 0xd3, 0x8a, 0xf6,
-      0xed, 0x76, 0xe6, 0xb1, 0x49, 0x9c, 0x83, 0x1f },
-    { 0x88, 0x51, 0x76, 0x78, 0x61, 0xc9, 0x72, 0x7d,
-      0x92, 0x77, 0x63, 0x62, 0x78, 0xfb, 0x94, 0x1b,
-      0x88, 0x85, 0xd9, 0x99, 0x02, 0x48, 0xbf, 0x91,
-      0x45, 0x9e, 0x52, 0x7c, 0xe7, 0xf0, 0x6c, 0xf6 },
     { 0x88, 0x76, 0x88, 0xdc, 0x6e, 0x9f, 0xe3, 0xdb,
       0x05, 0x05, 0x7f, 0xc6, 0x38, 0xeb, 0x8b, 0x29,
       0x4c, 0x3d, 0x8e, 0x0a, 0xae, 0x17, 0x51, 0xf7,
@@ -2002,10 +1758,6 @@
       0x81, 0x0d, 0x6e, 0x19, 0xf5, 0xf8, 0x8e, 0xa2,
       0xc6, 0x5d, 0xb7, 0xa2, 0xe8, 0xa5, 0x06, 0xf7,
       0xdf, 0x99, 0x55, 0x81, 0x7d, 0xdd, 0xeb, 0xc8 },
-    { 0x8d, 0x74, 0xc0, 0xd6, 0x6b, 0xb2, 0xee, 0xb2,
-      0x6b, 0x9a, 0x55, 0x74, 0x38, 0x5d, 0xa7, 0xb4,
-      0x14, 0x0a, 0xf0, 0x70, 0x47, 0xd2, 0xfe, 0x64,
-      0x3d, 0x1d, 0x1a, 0xe5, 0xb1, 0x96, 0x90, 0x43 },
     { 0x8d, 0x85, 0xda, 0x44, 0x6f, 0x5c, 0x79, 0x54,
       0xbd, 0xf7, 0x6c, 0x09, 0x0c, 0xd2, 0x46, 0x68,
       0xff, 0x23, 0x3c, 0xcd, 0xf6, 0x6b, 0x94, 0xda,
@@ -2182,10 +1934,6 @@
       0x60, 0x71, 0xd3, 0x82, 0x18, 0x1a, 0xf6, 0xcb,
       0x25, 0xbd, 0xc5, 0x87, 0x5e, 0x29, 0xf0, 0xf4,
       0xd7, 0x19, 0xa9, 0xd3, 0x5b, 0x5b, 0xd6, 0xbf },
-    { 0x99, 0xb1, 0x38, 0xbb, 0x53, 0xc5, 0x4d, 0x1c,
-      0x7a, 0xc2, 0x9a, 0x57, 0x85, 0xc8, 0xb1, 0x9f,
-      0xdd, 0xc3, 0x7d, 0x99, 0x4a, 0x3e, 0x6c, 0x31,
-      0xf7, 0x50, 0xa1, 0xbf, 0xeb, 0xe9, 0xfe, 0xf9 },
     { 0x99, 0xb4, 0x6c, 0x68, 0x90, 0x62, 0x37, 0x40,
       0x23, 0xdb, 0x68, 0x19, 0xf8, 0x89, 0xd3, 0xc1,
       0xbb, 0x8a, 0x83, 0x8c, 0x6b, 0x51, 0x7e, 0x32,
@@ -2258,18 +2006,10 @@
       0xfe, 0x1f, 0xd8, 0xdf, 0x2d, 0x36, 0xdd, 0xef,
       0x00, 0xc8, 0xfc, 0x7b, 0xf7, 0xb7, 0xfd, 0x7e,
       0x8d, 0x45, 0x92, 0xab, 0xf3, 0xc4, 0x21, 0xde },
-    { 0x9e, 0x85, 0xd4, 0xac, 0x8b, 0x36, 0x0e, 0x4d,
-      0xb2, 0xed, 0x37, 0x34, 0x10, 0x16, 0xe3, 0x7b,
-      0xd5, 0x5c, 0x2d, 0x59, 0x79, 0x5d, 0x0a, 0x7c,
-      0x26, 0xa4, 0x4e, 0x7e, 0x80, 0x98, 0x3e, 0x75 },
     { 0x9e, 0x98, 0xf7, 0xda, 0x04, 0x74, 0xd4, 0x86,
       0x5a, 0xc7, 0x05, 0xd4, 0xd7, 0xab, 0xbe, 0xb7,
       0x1a, 0xef, 0xba, 0x2c, 0xf2, 0xe0, 0x82, 0xf0,
       0x5f, 0xed, 0x53, 0x62, 0x41, 0x4b, 0xd3, 0x93 },
-    { 0x9e, 0xea, 0x28, 0xdf, 0x01, 0x4d, 0x91, 0x24,
-      0x4f, 0xf9, 0x31, 0x4f, 0x43, 0x4a, 0x84, 0x7b,
-      0x65, 0x89, 0xc1, 0xf2, 0x03, 0x58, 0x33, 0x9d,
-      0x79, 0xfc, 0xa6, 0x76, 0x63, 0x2d, 0xff, 0xfe },
     { 0x9f, 0x24, 0x5c, 0x0a, 0x0e, 0xc6, 0x3a, 0xaa,
       0xcb, 0xf9, 0x69, 0xc6, 0xfc, 0x24, 0xa1, 0x07,
       0x15, 0x83, 0xb7, 0x79, 0xa5, 0x8a, 0xb6, 0x23,
@@ -2282,18 +2022,10 @@
       0xb6, 0x2f, 0xa6, 0xe3, 0x23, 0x95, 0xeb, 0xe8,
       0x33, 0x34, 0x46, 0x00, 0x43, 0x6d, 0xac, 0xc9,
       0xb5, 0x69, 0x21, 0x4e, 0xeb, 0x8c, 0x0a, 0xf0 },
-    { 0x9f, 0xf9, 0x38, 0x40, 0xb0, 0x1f, 0x96, 0xb6,
-      0xf3, 0xc3, 0x10, 0xa0, 0x21, 0x90, 0xad, 0xc3,
-      0x3a, 0x15, 0x69, 0x39, 0x5b, 0xbc, 0xee, 0x11,
-      0x6a, 0x15, 0xe1, 0x58, 0xa6, 0x2b, 0xa5, 0x0b },
     { 0xa0, 0x05, 0x20, 0xb9, 0x68, 0xbf, 0xcb, 0x63,
       0x40, 0x87, 0x9f, 0xa8, 0x43, 0x82, 0x0c, 0xec,
       0x95, 0x45, 0x86, 0x0f, 0xe2, 0x9e, 0x2f, 0x8f,
       0xee, 0x00, 0xb0, 0x0f, 0xf8, 0x43, 0x42, 0x74 },
-    { 0xa0, 0x44, 0xf2, 0xc0, 0x41, 0xf4, 0x18, 0x5b,
-      0xc0, 0xfe, 0x1a, 0xd3, 0xe0, 0xa3, 0xe0, 0xc2,
-      0x7e, 0x24, 0xf4, 0x58, 0xdc, 0xb7, 0xd9, 0x07,
-      0x39, 0xb6, 0x4a, 0x68, 0x94, 0x45, 0xd4, 0xb6 },
     { 0xa0, 0x77, 0x42, 0xd5, 0xb2, 0x99, 0x96, 0x65,
       0x06, 0x76, 0x2e, 0x02, 0xe4, 0x20, 0xf1, 0xa9,
       0xc4, 0xab, 0x73, 0x29, 0xae, 0x29, 0x5f, 0x01,
@@ -2306,10 +2038,6 @@
       0x37, 0x14, 0xd5, 0xb3, 0x44, 0x5d, 0x88, 0xbe,
       0x81, 0xff, 0x5e, 0x1d, 0x16, 0x07, 0x3d, 0xc1,
       0x16, 0x6b, 0xb5, 0x44, 0x8f, 0xf6, 0x52, 0xdf },
-    { 0xa0, 0xc8, 0xa5, 0x3f, 0xd7, 0x58, 0x3e, 0x43,
-      0x91, 0xbe, 0xb8, 0xd0, 0xfe, 0xd8, 0x43, 0x1f,
-      0x61, 0xb8, 0x52, 0xc1, 0xbe, 0x43, 0xab, 0x91,
-      0x61, 0x4b, 0xbb, 0xeb, 0x3b, 0x4f, 0x47, 0x4e },
     { 0xa1, 0x50, 0x03, 0x2f, 0x4e, 0xf5, 0xd4, 0xfe,
       0xb0, 0xae, 0x4a, 0xe1, 0xcd, 0x54, 0x35, 0xba,
       0x04, 0xa9, 0xb6, 0xa0, 0xf9, 0x0e, 0x2f, 0x3c,
@@ -2354,18 +2082,10 @@
       0x4f, 0xdc, 0x08, 0x15, 0xb8, 0x6e, 0xa3, 0x03,
       0x34, 0x3c, 0xf8, 0xc1, 0x0f, 0x37, 0x27, 0x83,
       0x27, 0x14, 0x86, 0xb9, 0xc9, 0x3b, 0x63, 0x67 },
-    { 0xa5, 0xdb, 0xaf, 0x01, 0xd3, 0xd5, 0x79, 0xee,
-      0x8a, 0x48, 0x8e, 0xe8, 0xd7, 0x44, 0x09, 0x58,
-      0xf7, 0xbf, 0x97, 0xa2, 0xbc, 0xa8, 0xd9, 0x71,
-      0xf6, 0xf8, 0x97, 0x10, 0xbc, 0x2d, 0x10, 0x6f },
     { 0xa6, 0x21, 0xae, 0x36, 0x54, 0xac, 0xfd, 0x17,
       0x23, 0x30, 0x70, 0xe9, 0xb1, 0x8d, 0xfd, 0x91,
       0x6a, 0x55, 0x2e, 0x6a, 0x8b, 0x82, 0x42, 0xbd,
       0x57, 0xbb, 0xcd, 0xf4, 0xe6, 0x5e, 0x99, 0x76 },
-    { 0xa6, 0x26, 0x87, 0xde, 0x88, 0x0c, 0xf3, 0x35,
-      0xae, 0x42, 0x4d, 0x4a, 0xde, 0x29, 0xc7, 0xec,
-      0x33, 0xbf, 0xb9, 0xf8, 0x6e, 0xc7, 0xfc, 0xaf,
-      0x61, 0x9d, 0x71, 0x7c, 0x86, 0xb8, 0xfb, 0xbc },
     { 0xa6, 0x33, 0x5d, 0xf3, 0xab, 0xa5, 0xea, 0xdf,
       0xbd, 0xc9, 0xc2, 0xdc, 0x9d, 0x6b, 0xe6, 0x0b,
       0xb6, 0x2d, 0xf2, 0xfe, 0x24, 0xec, 0x7b, 0xa7,
@@ -2402,10 +2122,6 @@
       0x32, 0xed, 0xb3, 0xc8, 0xd6, 0x8c, 0xe1, 0x35,
       0x1a, 0x48, 0xb5, 0x6f, 0x70, 0x11, 0xbb, 0x99,
       0x20, 0xcf, 0xca, 0x75, 0x7e, 0x57, 0xc6, 0xc4 },
-    { 0xa7, 0x86, 0x18, 0xd8, 0xa7, 0xf0, 0x08, 0xaf,
-      0xdc, 0x72, 0x44, 0x98, 0x2c, 0x11, 0x34, 0xc5,
-      0xdc, 0x91, 0xec, 0x94, 0x25, 0xbf, 0xef, 0xc8,
-      0xcc, 0x0a, 0xf8, 0xf8, 0xc7, 0x59, 0x61, 0xc2 },
     { 0xa8, 0x53, 0xad, 0xc1, 0xc2, 0x18, 0x59, 0xaf,
       0x7c, 0x46, 0x2b, 0x4a, 0xa0, 0xa5, 0x74, 0xca,
       0x9f, 0xee, 0xfb, 0x18, 0x5a, 0x1f, 0xdb, 0xb6,
@@ -2414,10 +2130,6 @@
       0x11, 0x6f, 0x6a, 0x8b, 0x01, 0xe2, 0x95, 0xcd,
       0x60, 0x72, 0x69, 0x5a, 0xb1, 0x65, 0x4b, 0x7b,
       0xf9, 0xc4, 0x7e, 0x06, 0x20, 0x25, 0x6f, 0x81 },
-    { 0xa8, 0xc6, 0xb0, 0x72, 0x2a, 0x0d, 0x13, 0xdc,
-      0x8b, 0x7f, 0xbb, 0x20, 0xbc, 0x66, 0xe6, 0x03,
-      0x0e, 0x4b, 0xde, 0x99, 0xea, 0xca, 0x9c, 0x96,
-      0x5d, 0x34, 0x65, 0xc9, 0xab, 0xff, 0x64, 0x11 },
     { 0xa8, 0xdf, 0xf0, 0x6a, 0x17, 0x35, 0xb4, 0x6d,
       0x17, 0xda, 0xeb, 0xc3, 0x43, 0x43, 0x18, 0x31,
       0x3b, 0x2d, 0x9e, 0x7c, 0x3e, 0xf4, 0x8f, 0x28,
@@ -2430,18 +2142,6 @@
       0x56, 0x21, 0x2d, 0xb3, 0xab, 0x34, 0x89, 0x6e,
       0x91, 0x70, 0x93, 0x11, 0x3e, 0x47, 0xca, 0x35,
       0x96, 0x2e, 0xac, 0xca, 0x9c, 0xb3, 0x86, 0xf0 },
-    { 0xa9, 0x20, 0x6f, 0x6d, 0x45, 0x43, 0xed, 0x74,
-      0x4a, 0x5f, 0x15, 0x4a, 0xcb, 0x44, 0x50, 0x89,
-      0x6b, 0x62, 0x5d, 0x7e, 0x32, 0x33, 0x85, 0xa9,
-      0xfd, 0x25, 0x63, 0x93, 0x2f, 0x9c, 0xcc, 0x1b },
-    { 0xa9, 0x4c, 0xc9, 0xde, 0x55, 0x52, 0xa6, 0xd9,
-      0x6f, 0xe4, 0x10, 0xbe, 0x03, 0x97, 0x6f, 0x6b,
-      0x0d, 0x4d, 0xa0, 0x5d, 0x73, 0x7a, 0xd2, 0xa3,
-      0x1e, 0x0b, 0xad, 0x90, 0x82, 0xa5, 0x77, 0xb1 },
-    { 0xa9, 0x5c, 0x06, 0x3e, 0x9e, 0x35, 0x84, 0xe5,
-      0x99, 0x88, 0xf0, 0x73, 0x86, 0x4c, 0x18, 0x76,
-      0xb5, 0xdf, 0x9b, 0x44, 0xc6, 0x1b, 0x4a, 0x8b,
-      0xe4, 0x83, 0xbe, 0x05, 0xcf, 0xd1, 0xa1, 0xa6 },
     { 0xa9, 0x71, 0x2f, 0x85, 0xed, 0x2e, 0x25, 0xad,
       0xa5, 0x7d, 0xc1, 0xf0, 0xf8, 0x6d, 0xe1, 0x07,
       0xb5, 0xe2, 0xf0, 0x36, 0x09, 0x53, 0xf1, 0xed,
@@ -2470,10 +2170,6 @@
       0xec, 0xce, 0x7f, 0x5e, 0x61, 0x59, 0x9a, 0xf5,
       0x26, 0x69, 0xbf, 0x59, 0x50, 0x7f, 0x8e, 0xf1,
       0x99, 0x13, 0xc4, 0x2e, 0xe1, 0x29, 0xda, 0xf0 },
-    { 0xab, 0xa7, 0x8e, 0x90, 0xf3, 0x24, 0x17, 0xae,
-      0xc2, 0x8e, 0xea, 0x30, 0x22, 0xa2, 0xe2, 0xb7,
-      0x66, 0x1a, 0xc7, 0x23, 0xc8, 0x7e, 0x0d, 0xbc,
-      0xe2, 0x33, 0xe2, 0x16, 0x8f, 0xcf, 0x91, 0xb3 },
     { 0xab, 0xeb, 0x6a, 0xa0, 0xd1, 0xb0, 0xe0, 0x49,
       0xd6, 0x9d, 0xf8, 0x3a, 0xdd, 0x19, 0xf7, 0x26,
       0x8a, 0x38, 0xde, 0x6c, 0x00, 0x72, 0x60, 0x68,
@@ -2486,10 +2182,6 @@
       0x5a, 0xd4, 0xa3, 0xba, 0x3d, 0x4b, 0x01, 0x84,
       0x91, 0xf3, 0x66, 0x1a, 0x37, 0x9b, 0x3d, 0xfe,
       0xdd, 0x6f, 0xd3, 0xc3, 0x2e, 0xfa, 0x84, 0x7d },
-    { 0xac, 0x8c, 0x6f, 0x03, 0xe4, 0xba, 0xcf, 0x72,
-      0x20, 0x25, 0xdb, 0x54, 0xd0, 0xfa, 0xae, 0x7d,
-      0xbe, 0x51, 0x37, 0x97, 0x37, 0x39, 0x45, 0x05,
-      0xf0, 0x86, 0xaa, 0x89, 0xe2, 0xd4, 0xf7, 0x3b },
     { 0xac, 0x90, 0x98, 0xf6, 0x4f, 0xe1, 0x03, 0xc8,
       0xc1, 0x40, 0x30, 0xdb, 0xce, 0xdd, 0x63, 0xd1,
       0xd1, 0x7c, 0x33, 0x8e, 0xbd, 0x1d, 0x7d, 0xe5,
@@ -2610,10 +2302,6 @@
       0xa0, 0x49, 0xfe, 0x83, 0xf3, 0xd2, 0x9b, 0x38,
       0x5b, 0x90, 0xd3, 0xd0, 0x0b, 0xa8, 0x57, 0xd6,
       0x2f, 0x19, 0x67, 0x81, 0xdd, 0xa3, 0xd1, 0x85 },
-    { 0xb4, 0x2c, 0x64, 0xf0, 0x25, 0xdf, 0x8f, 0x37,
-      0x0e, 0xb7, 0xa4, 0x69, 0x94, 0x2b, 0x97, 0xe2,
-      0xf8, 0xb5, 0xf4, 0xbf, 0xac, 0xc4, 0xcf, 0x17,
-      0xd2, 0xa0, 0x8f, 0xca, 0x57, 0xbb, 0xc4, 0x9b },
     { 0xb4, 0xae, 0x2a, 0x6b, 0xfc, 0xa5, 0x31, 0xc9,
       0x9c, 0x69, 0xb3, 0x5a, 0xfe, 0x67, 0x54, 0xfc,
       0x49, 0x27, 0x5b, 0x6c, 0xca, 0xcd, 0xc8, 0x26,
@@ -2666,14 +2354,6 @@
       0x4f, 0x2b, 0x81, 0xf7, 0xf7, 0x21, 0x06, 0x73,
       0xe9, 0x73, 0x08, 0xaf, 0xf1, 0x24, 0x3f, 0x26,
       0x99, 0x5a, 0x25, 0xfa, 0x23, 0x0c, 0xfe, 0x4c },
-    { 0xb7, 0x45, 0x85, 0x05, 0xc5, 0x17, 0x90, 0x14,
-      0x9c, 0x5e, 0x98, 0x00, 0xfd, 0x22, 0x74, 0x8a,
-      0x1d, 0x44, 0x66, 0x5f, 0x68, 0x34, 0xba, 0x84,
-      0x4e, 0x9a, 0x0c, 0x32, 0x31, 0x4a, 0x57, 0x21 },
-    { 0xb7, 0x9f, 0xca, 0x4d, 0x47, 0x92, 0xec, 0x5e,
-      0x5a, 0x74, 0x06, 0x59, 0x81, 0x3a, 0x0f, 0x46,
-      0x08, 0xea, 0xf9, 0xba, 0x9c, 0xbb, 0xa8, 0xa0,
-      0xf8, 0xda, 0xe1, 0xdd, 0xbb, 0xe6, 0x1e, 0x77 },
     { 0xb7, 0xa2, 0xae, 0x06, 0x06, 0xaa, 0x2c, 0xfb,
       0x27, 0x01, 0xb3, 0xb2, 0x77, 0xf4, 0xd7, 0x12,
       0x54, 0x70, 0x48, 0x7e, 0xfd, 0x94, 0x05, 0x85,
@@ -2694,10 +2374,6 @@
       0x62, 0xb6, 0x2f, 0x36, 0x50, 0xdb, 0x00, 0xa3,
       0x45, 0xf4, 0x6a, 0x0e, 0x8e, 0x01, 0x1a, 0x20,
       0x01, 0x3f, 0xd8, 0xed, 0xce, 0x25, 0x27, 0x0d },
-    { 0xb9, 0xcc, 0x92, 0xf7, 0x8c, 0x2c, 0x19, 0x57,
-      0xdb, 0xb6, 0xc4, 0xa5, 0xe4, 0x25, 0x44, 0x68,
-      0xfb, 0xcd, 0x88, 0xb1, 0xfd, 0x9f, 0x98, 0xfa,
-      0x6d, 0x76, 0x08, 0x70, 0x9e, 0xbe, 0x92, 0x8d },
     { 0xba, 0x18, 0x2c, 0x1b, 0x75, 0xd8, 0xdf, 0xd1,
       0x18, 0x92, 0xe4, 0x77, 0x59, 0x59, 0xad, 0x8a,
       0x8c, 0x78, 0x2c, 0xef, 0x60, 0xec, 0xea, 0xbe,
@@ -2714,10 +2390,6 @@
       0x51, 0x61, 0x13, 0x55, 0x2c, 0x17, 0xab, 0x77,
       0x82, 0xa7, 0xeb, 0xba, 0xea, 0x0b, 0xe3, 0x9f,
       0x58, 0x92, 0x84, 0x1f, 0x1f, 0x74, 0xd2, 0x98 },
-    { 0xbb, 0x13, 0xdf, 0x73, 0xb6, 0xe8, 0x89, 0x77,
-      0x7c, 0x4d, 0x85, 0xec, 0x93, 0xb8, 0x3e, 0xa8,
-      0xbb, 0x95, 0x43, 0xf9, 0xfc, 0x08, 0xc2, 0xb3,
-      0x1c, 0x02, 0xac, 0x72, 0xb3, 0x1a, 0x09, 0x0d },
     { 0xbb, 0x5c, 0xb3, 0x78, 0xb7, 0xb9, 0x48, 0x7f,
       0xa6, 0x1b, 0xc0, 0x91, 0x3d, 0xa1, 0xdf, 0x26,
       0xa1, 0xcf, 0xef, 0xf7, 0x45, 0x2d, 0x9b, 0xa3,
@@ -2734,14 +2406,6 @@
       0x8c, 0xa8, 0xbc, 0x2c, 0x62, 0xfb, 0xcc, 0x40,
       0x17, 0xff, 0x24, 0x96, 0x98, 0xbe, 0xed, 0xfb,
       0x1e, 0xf3, 0x6f, 0x37, 0x5f, 0xb3, 0x9f, 0x72 },
-    { 0xbc, 0x1a, 0x3b, 0x83, 0x46, 0xa5, 0x18, 0x4e,
-      0x8f, 0xe2, 0xa9, 0x36, 0xd6, 0xd9, 0xce, 0x2c,
-      0xbe, 0x3a, 0x92, 0x05, 0x54, 0xe0, 0x60, 0xf9,
-      0x07, 0x97, 0xf9, 0x8f, 0xee, 0x62, 0xa8, 0x52 },
-    { 0xbc, 0x98, 0x39, 0xc8, 0xb9, 0x22, 0xf6, 0x54,
-      0x57, 0x67, 0xa2, 0xba, 0x46, 0x5a, 0x5b, 0xea,
-      0x9a, 0xa1, 0x84, 0x11, 0x52, 0x99, 0x4a, 0x6c,
-      0xf4, 0x67, 0x83, 0xae, 0x49, 0x98, 0xaf, 0xcc },
     { 0xbd, 0x2e, 0x2f, 0x37, 0xc9, 0x66, 0xc3, 0x86,
       0xd9, 0x70, 0x44, 0xfd, 0xe3, 0xe3, 0xf9, 0x00,
       0xfb, 0x1a, 0x0b, 0x04, 0x03, 0xb5, 0x81, 0x72,
@@ -2750,10 +2414,6 @@
       0x2a, 0xa7, 0xa7, 0x5f, 0x77, 0x63, 0xa8, 0x38,
       0xcf, 0x4b, 0xa1, 0x7f, 0xb3, 0x64, 0x72, 0xba,
       0x12, 0x69, 0x8c, 0x45, 0xdf, 0x88, 0xe8, 0x46 },
-    { 0xbe, 0x2e, 0x88, 0xc5, 0xee, 0x30, 0x7b, 0xa5,
-      0x41, 0x73, 0xa6, 0x00, 0x2b, 0x99, 0x16, 0x92,
-      0xc8, 0xbd, 0x1d, 0x40, 0x8a, 0x59, 0x2f, 0x70,
-      0x7b, 0xb1, 0xaf, 0x56, 0xf5, 0xb9, 0xd7, 0x42 },
     { 0xbe, 0x41, 0x0a, 0x51, 0xd3, 0x44, 0x17, 0x76,
       0x91, 0xb3, 0x42, 0x64, 0x10, 0xa4, 0x41, 0xaf,
       0xd1, 0xc9, 0x40, 0xb1, 0xb2, 0x7c, 0xf5, 0x29,
@@ -2762,10 +2422,6 @@
       0xb6, 0x20, 0x4f, 0x20, 0x13, 0x1b, 0x01, 0xff,
       0x28, 0xb7, 0xdd, 0xff, 0x36, 0x2e, 0x42, 0x9b,
       0xfd, 0xf8, 0x8f, 0x36, 0x37, 0x58, 0x24, 0x51 },
-    { 0xbe, 0xac, 0x00, 0x60, 0x68, 0x7e, 0xb2, 0x5a,
-      0x9b, 0xed, 0x21, 0xa1, 0x99, 0x97, 0xaf, 0xff,
-      0x67, 0x7c, 0x89, 0x61, 0xdc, 0x00, 0xe2, 0x3b,
-      0x4c, 0x1e, 0x27, 0x7f, 0xf8, 0x58, 0xc0, 0x92 },
     { 0xbe, 0xb9, 0x09, 0x0c, 0x92, 0xd1, 0x6b, 0xd0,
       0x5a, 0xf3, 0x91, 0x5a, 0x39, 0xcc, 0x2a, 0xfa,
       0x9f, 0x6a, 0x8a, 0x6f, 0xbe, 0xd4, 0xfe, 0x54,
@@ -2814,10 +2470,6 @@
       0xf7, 0xbd, 0x38, 0x95, 0x54, 0x60, 0xc3, 0xfc,
       0x43, 0x55, 0x0d, 0x97, 0x7f, 0x25, 0xe3, 0x43,
       0xd4, 0x9c, 0xd4, 0xaf, 0xad, 0xf2, 0x09, 0x3c },
-    { 0xc0, 0xd3, 0xdc, 0x9a, 0x2d, 0x13, 0x9d, 0x38,
-      0xce, 0x02, 0xc0, 0x78, 0xf3, 0xc2, 0x92, 0x5d,
-      0x89, 0x1d, 0x24, 0xe4, 0x36, 0x13, 0xcb, 0xee,
-      0x3f, 0x18, 0xa2, 0xc8, 0x60, 0x98, 0x84, 0xb2 },
     { 0xc0, 0xfe, 0xb7, 0x2a, 0x5f, 0x33, 0x16, 0x5c,
       0x0d, 0xc7, 0xc4, 0x24, 0x7e, 0x23, 0xf3, 0x8c,
       0xc6, 0x1f, 0x25, 0x24, 0x42, 0xb2, 0xf6, 0x13,
@@ -2938,10 +2590,6 @@
       0x8a, 0x88, 0x16, 0x10, 0x63, 0x70, 0x86, 0xf8,
       0x8d, 0x9a, 0x11, 0x5e, 0x00, 0x92, 0x46, 0xd2,
       0x7f, 0x48, 0x9f, 0xa7, 0x18, 0x51, 0x88, 0xa8 },
-    { 0xc7, 0xf8, 0x85, 0xe4, 0x1a, 0xa5, 0x3b, 0x8c,
-      0xb8, 0xe4, 0xe5, 0x59, 0xc4, 0x04, 0x3a, 0x87,
-      0xda, 0xfb, 0x78, 0x7a, 0x0d, 0x2b, 0x2e, 0xf1,
-      0xbc, 0xc0, 0x55, 0x71, 0xb7, 0x5d, 0x4e, 0x29 },
     { 0xc7, 0xff, 0x8e, 0xfd, 0xec, 0xdf, 0x00, 0xd1,
       0xfc, 0x8d, 0x55, 0x2d, 0x2a, 0x70, 0x70, 0xe5,
       0xe3, 0x3d, 0x42, 0xe5, 0x90, 0xf5, 0x86, 0xc6,
@@ -2974,10 +2622,6 @@
       0xb6, 0x1b, 0x90, 0x92, 0xa9, 0xaa, 0x96, 0x81,
       0x62, 0x36, 0x55, 0xa6, 0x6f, 0x4f, 0xcb, 0xc4,
       0xd3, 0xa6, 0x7e, 0xfd, 0x56, 0x72, 0x48, 0x30 },
-    { 0xc9, 0x7e, 0x4d, 0x81, 0xe7, 0x4e, 0x3d, 0x0a,
-      0x5e, 0xe0, 0x9c, 0x6f, 0x76, 0x9b, 0x95, 0x7e,
-      0x70, 0x04, 0xad, 0x2c, 0x9f, 0xc6, 0x66, 0x8a,
-      0x69, 0xd6, 0xca, 0x29, 0xe0, 0x66, 0xe7, 0xfe },
     { 0xca, 0x55, 0x6f, 0x82, 0xc9, 0x68, 0x4c, 0x9a,
       0xf3, 0x55, 0x7d, 0x3e, 0x2d, 0x88, 0xaf, 0x92,
       0xed, 0x25, 0x9c, 0x20, 0xff, 0xd1, 0xdd, 0xe9,
@@ -3014,10 +2658,6 @@
       0x49, 0xc8, 0xb7, 0xa8, 0x14, 0x8f, 0x26, 0xd7,
       0x71, 0x08, 0x3e, 0xc5, 0x18, 0xf9, 0xb6, 0x6f,
       0xf5, 0x47, 0xf2, 0x82, 0x2d, 0x11, 0x93, 0x6d },
-    { 0xcc, 0x4e, 0x09, 0x63, 0x13, 0xdf, 0xa0, 0xcc,
-      0x24, 0x77, 0xa3, 0xa5, 0xb7, 0x9a, 0xef, 0x0a,
-      0x45, 0x54, 0x58, 0x69, 0xa7, 0xf8, 0x8a, 0x29,
-      0x14, 0x96, 0x06, 0x4b, 0x69, 0x76, 0xe1, 0x4d },
     { 0xcc, 0x65, 0xcd, 0xc5, 0x33, 0x62, 0xd4, 0x21,
       0x62, 0x7e, 0xae, 0xf5, 0xd0, 0xc8, 0xe4, 0xc4,
       0xe2, 0x40, 0xad, 0xe0, 0xc9, 0xd4, 0x20, 0xbe,
@@ -3054,10 +2694,6 @@
       0x85, 0xf5, 0xb6, 0x4e, 0x65, 0x22, 0x8d, 0x03,
       0xfc, 0x77, 0x93, 0xd9, 0x49, 0x42, 0xf8, 0x8a,
       0x1c, 0x72, 0xbb, 0x7b, 0x61, 0x14, 0x51, 0xd5 },
-    { 0xcf, 0x03, 0x40, 0x17, 0x5b, 0x25, 0x03, 0xc8,
-      0xfa, 0x5d, 0x52, 0xed, 0x42, 0x5b, 0xf3, 0x7e,
-      0x69, 0xc1, 0x80, 0xe5, 0x75, 0xad, 0xc1, 0xa2,
-      0x6a, 0x47, 0x81, 0x97, 0x71, 0xb6, 0x8f, 0x7d },
     { 0xcf, 0x92, 0x77, 0xce, 0xea, 0x50, 0x1a, 0x49,
       0x66, 0x04, 0x3e, 0xf2, 0xb0, 0xf8, 0x86, 0x2a,
       0xc9, 0x00, 0x93, 0x89, 0x78, 0x08, 0x26, 0x22,
@@ -3082,14 +2718,6 @@
       0xbb, 0x8b, 0xaf, 0x57, 0xf5, 0xc4, 0x5b, 0x69,
       0x16, 0x8c, 0x3a, 0x6e, 0xe3, 0xfb, 0xcd, 0xf3,
       0xec, 0x2a, 0x77, 0xe8, 0x7c, 0x7c, 0x50, 0x09 },
-    { 0xd1, 0xfa, 0xd9, 0xa8, 0xe6, 0x2e, 0x06, 0xcf,
-      0x9b, 0x40, 0x3a, 0xdf, 0x51, 0xed, 0x60, 0x75,
-      0xec, 0xe7, 0x61, 0xa1, 0x0d, 0xd6, 0xa4, 0xd8,
-      0xde, 0x08, 0x82, 0x2f, 0xbb, 0x08, 0x22, 0xfd },
-    { 0xd2, 0x3f, 0xeb, 0x93, 0x47, 0x60, 0xb8, 0xdf,
-      0x4e, 0xe6, 0xb0, 0xe8, 0xbb, 0x4f, 0x5d, 0x31,
-      0x5d, 0x40, 0x5b, 0xf0, 0x56, 0x18, 0x2e, 0x5d,
-      0x5f, 0x70, 0x20, 0x31, 0x94, 0x61, 0x8a, 0x05 },
     { 0xd2, 0x56, 0x79, 0xcb, 0x58, 0x3b, 0xa0, 0x10,
       0x8f, 0x74, 0x97, 0xe3, 0x21, 0xc6, 0x5c, 0x4d,
       0xc2, 0xca, 0x0f, 0x28, 0x20, 0xc7, 0xfc, 0xdb,
@@ -3102,18 +2730,10 @@
       0x4c, 0x2d, 0xfe, 0x94, 0xcb, 0x44, 0x50, 0x37,
       0x1e, 0x72, 0x36, 0xbd, 0xbd, 0x1c, 0x81, 0x13,
       0xff, 0x36, 0x0f, 0xa4, 0xa1, 0x58, 0x1e, 0xfc },
-    { 0xd2, 0xd1, 0x84, 0xca, 0x5b, 0x97, 0xac, 0x7b,
-      0xd3, 0x4e, 0x78, 0x42, 0x4c, 0xa0, 0xc2, 0xb3,
-      0x9c, 0x35, 0x08, 0x52, 0xcc, 0xb1, 0x33, 0xe5,
-      0xa1, 0x87, 0xf7, 0x61, 0x7d, 0x00, 0xb0, 0x2c },
     { 0xd2, 0xe8, 0xa1, 0x23, 0x7a, 0x93, 0xf5, 0x78,
       0xd1, 0xba, 0x8f, 0x09, 0xe4, 0xff, 0x10, 0x7b,
       0x62, 0x35, 0x78, 0x85, 0x42, 0xaa, 0x61, 0x83,
       0xd1, 0x76, 0xdb, 0xf1, 0xc8, 0x8d, 0xcf, 0xb6 },
-    { 0xd3, 0x10, 0x0b, 0xc8, 0x42, 0x8b, 0xa2, 0x3a,
-      0xe1, 0x3b, 0x41, 0xea, 0xa2, 0x95, 0xbf, 0xbf,
-      0xd6, 0x97, 0xf5, 0x0b, 0x81, 0xca, 0xef, 0x6a,
-      0x30, 0xa4, 0xd1, 0x99, 0x47, 0x1b, 0x9f, 0x32 },
     { 0xd3, 0x22, 0xe0, 0xc4, 0x4e, 0xa7, 0x92, 0xc0,
       0x00, 0x13, 0x01, 0xa6, 0x32, 0xa1, 0x1d, 0x50,
       0x6e, 0xa9, 0x17, 0xde, 0xed, 0xca, 0x8e, 0xd0,
@@ -3134,10 +2754,6 @@
       0x3b, 0xb9, 0x9f, 0x80, 0x68, 0xcf, 0xee, 0x86,
       0xa4, 0xb9, 0xf0, 0x89, 0xe0, 0x2d, 0x0c, 0x6c,
       0xb6, 0xd4, 0xa3, 0x94, 0x6c, 0x6b, 0x16, 0x7a },
-    { 0xd5, 0x50, 0xb9, 0xa6, 0xd5, 0xc3, 0xf5, 0x25,
-      0x7c, 0x99, 0xb9, 0x94, 0x43, 0x69, 0x88, 0x3d,
-      0xa1, 0x1d, 0xbe, 0x23, 0xb9, 0x6e, 0x19, 0x34,
-      0xed, 0xed, 0x52, 0x1b, 0x73, 0x55, 0xe4, 0x44 },
     { 0xd5, 0x83, 0x94, 0x96, 0xcd, 0xc8, 0x5b, 0xe3,
       0xd1, 0xf1, 0xac, 0x65, 0x2e, 0xfa, 0x92, 0xbe,
       0xa3, 0xb0, 0x61, 0xc1, 0x3d, 0xad, 0x5a, 0x82,
@@ -3154,10 +2770,6 @@
       0xaa, 0x7e, 0x87, 0x8e, 0x6a, 0x85, 0x09, 0x1b,
       0xaa, 0x07, 0x8d, 0x26, 0x8b, 0xbd, 0xb4, 0x9f,
       0x09, 0x67, 0x94, 0x08, 0x61, 0x2d, 0x1e, 0xfe },
-    { 0xd6, 0x46, 0x08, 0xb1, 0x5f, 0x71, 0xfc, 0x3b,
-      0x91, 0x90, 0xa2, 0x00, 0xee, 0x3c, 0xb5, 0xbc,
-      0xd9, 0xfc, 0x5b, 0x99, 0xfb, 0x67, 0x74, 0x9d,
-      0x18, 0x87, 0xd9, 0x17, 0xd8, 0x50, 0x01, 0x0b },
     { 0xd6, 0x83, 0xd0, 0x6e, 0xb9, 0x28, 0x74, 0x43,
       0xe5, 0x01, 0xec, 0xf7, 0x1d, 0xad, 0xa6, 0x80,
       0x35, 0x88, 0x71, 0xd1, 0x2a, 0x53, 0xfb, 0xcc,
@@ -3190,10 +2802,6 @@
       0x0b, 0x84, 0xd9, 0xa1, 0x7b, 0x1e, 0x90, 0x24,
       0xf6, 0x27, 0xc1, 0xec, 0xc3, 0x5e, 0xc7, 0xe6,
       0x71, 0xc1, 0x42, 0x92, 0xa7, 0xb8, 0x8b, 0x43 },
-    { 0xd8, 0x55, 0x49, 0xfc, 0xd2, 0x4d, 0x36, 0xcb,
-      0x3f, 0x7c, 0x18, 0x06, 0x3f, 0x97, 0x5a, 0x16,
-      0x9f, 0xe3, 0xa1, 0xfb, 0x8d, 0x0a, 0x35, 0x9f,
-      0xd3, 0x5c, 0x28, 0x7b, 0xb2, 0xaf, 0x50, 0xca },
     { 0xd8, 0x7a, 0x9d, 0xf7, 0x19, 0x1e, 0x29, 0xc8,
       0x04, 0x1e, 0x4c, 0x19, 0x3c, 0x03, 0xa8, 0xa7,
       0x12, 0x5f, 0x16, 0x6e, 0xa6, 0xcb, 0x21, 0x1f,
@@ -3218,10 +2826,6 @@
       0x4a, 0x3e, 0xd7, 0xfc, 0x55, 0x8c, 0x58, 0x45,
       0x64, 0x51, 0x60, 0xda, 0xb3, 0x53, 0x85, 0xc1,
       0x38, 0xbc, 0x89, 0x9c, 0x4d, 0xad, 0x8b, 0x36 },
-    { 0xd9, 0xd0, 0xd9, 0x6e, 0xb3, 0x28, 0xe0, 0xc1,
-      0x77, 0x8b, 0x56, 0xa9, 0x2f, 0x71, 0x24, 0x3b,
-      0x6c, 0x0d, 0xb4, 0x5c, 0x62, 0x51, 0x32, 0xdd,
-      0x82, 0xca, 0x11, 0xa0, 0x97, 0xe7, 0x91, 0xc6 },
     { 0xd9, 0xe8, 0xcc, 0xda, 0x78, 0xfb, 0x8d, 0x5d,
       0xbc, 0xe6, 0x94, 0x15, 0x57, 0x61, 0xf4, 0xd0,
       0x2c, 0x30, 0xcc, 0x8d, 0x7a, 0xea, 0x0e, 0x11,
@@ -3242,22 +2846,10 @@
       0xe5, 0x38, 0x9a, 0x26, 0x08, 0x1c, 0x99, 0x8b,
       0x5f, 0xfa, 0x67, 0xdd, 0x45, 0x97, 0xf8, 0xca,
       0x67, 0xef, 0x10, 0x6a, 0xd7, 0x5f, 0x34, 0x9f },
-    { 0xdb, 0xa1, 0x23, 0x67, 0x1f, 0xed, 0x4b, 0x28,
-      0x70, 0x33, 0xa4, 0xb0, 0x06, 0x8f, 0xc7, 0x14,
-      0xa5, 0xfc, 0x9c, 0x02, 0x6e, 0xf5, 0x65, 0x0b,
-      0x42, 0xde, 0x25, 0x85, 0x9a, 0x12, 0x6a, 0xd1 },
     { 0xdb, 0xa2, 0x21, 0xc2, 0xab, 0x44, 0xb5, 0x2c,
       0x0b, 0x83, 0x36, 0xc4, 0x69, 0xfa, 0xa8, 0x56,
       0xd6, 0xc3, 0xec, 0xdc, 0x6c, 0x24, 0x6b, 0xe3,
       0xca, 0xc7, 0xe0, 0xf6, 0x28, 0x4b, 0x5b, 0xda },
-    { 0xdc, 0x3d, 0x81, 0xc3, 0x01, 0xbc, 0xde, 0xc5,
-      0x38, 0xef, 0xc7, 0xfa, 0x6a, 0x4e, 0x5a, 0x13,
-      0xe5, 0x17, 0xd2, 0xa4, 0x61, 0x22, 0x2d, 0xed,
-      0x98, 0x3e, 0x75, 0x56, 0x4d, 0x0e, 0x68, 0x84 },
-    { 0xdc, 0x42, 0x4a, 0x70, 0x87, 0x80, 0x95, 0x98,
-      0x7a, 0x5b, 0xcd, 0x17, 0x1a, 0xa5, 0x13, 0x67,
-      0x7b, 0xda, 0x56, 0xdf, 0x35, 0xb6, 0x81, 0xc7,
-      0x07, 0x84, 0x0f, 0xdc, 0xea, 0xc5, 0xe4, 0x0f },
     { 0xdc, 0x90, 0x90, 0x55, 0x0c, 0x93, 0x42, 0xe2,
       0xfa, 0xe2, 0x42, 0x26, 0xa4, 0xf9, 0xb3, 0xf6,
       0x93, 0xf4, 0xd1, 0x46, 0x52, 0x79, 0xc3, 0x7b,
@@ -3274,10 +2866,6 @@
       0xf0, 0xfd, 0xdb, 0x6b, 0x37, 0xfe, 0x00, 0x28,
       0xde, 0x8b, 0x7d, 0x3c, 0xe5, 0x79, 0x1b, 0x45,
       0x0d, 0xd2, 0x83, 0xb2, 0x0a, 0xdb, 0x05, 0xd2 },
-    { 0xde, 0x45, 0x46, 0xc0, 0x24, 0x51, 0xa5, 0xb5,
-      0xad, 0x85, 0xea, 0x53, 0x2f, 0x09, 0x6f, 0xdf,
-      0x1e, 0x2b, 0x41, 0x71, 0xd9, 0x6a, 0x1d, 0xc3,
-      0x93, 0x6a, 0x19, 0x74, 0xf0, 0x58, 0xf0, 0xb2 },
     { 0xde, 0x5c, 0x3d, 0x09, 0x58, 0xa6, 0x12, 0xbd,
       0x6d, 0x48, 0x09, 0x15, 0x03, 0x3d, 0x97, 0x15,
       0x58, 0xdf, 0x35, 0xce, 0xb1, 0xc9, 0x18, 0xe6,
@@ -3314,26 +2902,14 @@
       0xc4, 0xba, 0x83, 0x99, 0xd4, 0xd8, 0xd5, 0xa0,
       0xd1, 0x98, 0x57, 0x8f, 0x42, 0x99, 0xfd, 0xfd,
       0xaf, 0xf7, 0x8c, 0x3f, 0x67, 0x71, 0xf3, 0x94 },
-    { 0xe0, 0x65, 0x19, 0x10, 0x41, 0x74, 0x08, 0xbe,
-      0x2b, 0x0c, 0xfd, 0x3d, 0x9e, 0xaa, 0xeb, 0xca,
-      0x32, 0x1f, 0x61, 0x6d, 0xda, 0x48, 0xcb, 0x4f,
-      0x09, 0x10, 0x9d, 0x67, 0x19, 0x45, 0xa1, 0x1c },
     { 0xe0, 0x8b, 0x2c, 0xc2, 0x7a, 0xe8, 0xe2, 0xef,
       0x1a, 0x33, 0x01, 0x7a, 0x9a, 0xc2, 0x5d, 0xda,
       0xfb, 0x5e, 0xa1, 0x12, 0xc9, 0x56, 0xb0, 0x02,
       0xfe, 0x6c, 0x79, 0x80, 0x14, 0xaa, 0x90, 0x65 },
-    { 0xe0, 0xa0, 0x7b, 0x39, 0x6d, 0x25, 0x7f, 0xab,
-      0xb4, 0xe3, 0x22, 0xd8, 0x79, 0x94, 0x88, 0x37,
-      0x28, 0x7a, 0xaa, 0x99, 0xad, 0x14, 0xd7, 0x8d,
-      0x3a, 0x2f, 0x9d, 0xfe, 0x5c, 0x97, 0x28, 0xbf },
     { 0xe0, 0xa9, 0xd9, 0x63, 0x6e, 0xfa, 0x36, 0xa7,
       0x72, 0xac, 0xb5, 0xd0, 0x22, 0xfc, 0xa9, 0x73,
       0x71, 0xb4, 0x4f, 0x7b, 0x80, 0x4b, 0x03, 0x97,
       0xfb, 0x6c, 0x37, 0x1a, 0x22, 0x5b, 0xda, 0x78 },
-    { 0xe0, 0xbb, 0xef, 0x7e, 0xe4, 0x37, 0xb0, 0x59,
-      0xe0, 0x3b, 0x52, 0x9b, 0xe6, 0xb4, 0x09, 0x6d,
-      0x56, 0xc7, 0x4e, 0x90, 0x67, 0xb0, 0x5f, 0x87,
-      0xaa, 0x6a, 0x5a, 0x61, 0x93, 0x40, 0xa7, 0xc3 },
     { 0xe0, 0xdd, 0xe1, 0x29, 0xd2, 0x60, 0xc3, 0xda,
       0xb6, 0x91, 0xd8, 0x1d, 0xab, 0xad, 0x73, 0x4c,
       0x9a, 0xdc, 0x61, 0xd2, 0x0c, 0x1a, 0xe1, 0xb6,
@@ -3374,10 +2950,6 @@
       0x7e, 0x1f, 0x45, 0x5b, 0x85, 0xc0, 0x6f, 0x0d,
       0x80, 0x9e, 0x75, 0xa5, 0x5c, 0x6b, 0x05, 0x48,
       0x16, 0xe0, 0x19, 0x89, 0x9a, 0x3a, 0x02, 0xff },
-    { 0xe3, 0x1f, 0xa0, 0xbd, 0xe8, 0x58, 0x9e, 0xdd,
-      0xda, 0x1c, 0x5d, 0x1a, 0xa9, 0xc5, 0x81, 0x86,
-      0xc3, 0x14, 0x36, 0x85, 0x67, 0xbd, 0xf9, 0xdc,
-      0xd5, 0x37, 0xaa, 0xe3, 0xcf, 0xf8, 0x77, 0x52 },
     { 0xe3, 0xc8, 0xfc, 0x63, 0x7b, 0x7b, 0xb0, 0xcc,
       0x67, 0x4a, 0x5a, 0x4c, 0x3b, 0x4d, 0x35, 0x62,
       0xeb, 0x8a, 0xa0, 0x0d, 0x7a, 0xd2, 0xc8, 0xa9,
@@ -3426,18 +2998,10 @@
       0xfa, 0x2b, 0xfb, 0x76, 0xc2, 0x2d, 0xfa, 0x71,
       0xbc, 0x3d, 0xa4, 0x8f, 0x67, 0x1e, 0xf7, 0x7c,
       0x00, 0xaa, 0x8e, 0x45, 0x9b, 0x7c, 0xc8, 0x2a },
-    { 0xe8, 0x1a, 0x87, 0x45, 0xad, 0x86, 0xf6, 0x5f,
-      0xa0, 0xd8, 0x51, 0xfc, 0xb7, 0x2e, 0x3e, 0xf5,
-      0x4d, 0x51, 0xbc, 0x60, 0xb9, 0x68, 0x0c, 0xb2,
-      0x5e, 0xb2, 0xf3, 0xac, 0x44, 0xea, 0xa7, 0xa4 },
     { 0xe8, 0x21, 0x3c, 0x45, 0x51, 0x81, 0x61, 0xbc,
       0x36, 0x37, 0x3d, 0xcd, 0x2d, 0x4b, 0x21, 0xb7,
       0x6a, 0x7c, 0x06, 0x6d, 0xf5, 0x52, 0x6e, 0x88,
       0x8b, 0x6e, 0xed, 0x09, 0xa9, 0xee, 0xd0, 0x62 },
-    { 0xe8, 0x6e, 0xe6, 0x9d, 0x51, 0xbe, 0x64, 0xf8,
-      0x28, 0xfc, 0x22, 0xcc, 0xe5, 0xbc, 0xc1, 0x1d,
-      0x24, 0xa5, 0xf1, 0x77, 0xf9, 0xba, 0x99, 0x51,
-      0x92, 0x71, 0xa4, 0xf3, 0x9f, 0x0c, 0x51, 0x7c },
     { 0xe8, 0xa6, 0x09, 0xec, 0x44, 0xf9, 0x3c, 0x12,
       0xe0, 0x81, 0xe5, 0x94, 0x3b, 0x5e, 0xa0, 0x48,
       0x68, 0x14, 0x48, 0x33, 0x32, 0x5d, 0xaa, 0x64,
@@ -3470,10 +3034,6 @@
       0x5a, 0x76, 0x07, 0x64, 0x3e, 0x15, 0x26, 0x0d,
       0x1c, 0x93, 0xfd, 0x9b, 0xe0, 0xfa, 0xb1, 0x0b,
       0x76, 0xdc, 0x96, 0x86, 0xf6, 0x54, 0xc6, 0xe5 },
-    { 0xec, 0x01, 0x78, 0xd1, 0xca, 0x3b, 0x94, 0x52,
-      0xaa, 0x5c, 0xd5, 0xd3, 0x75, 0x45, 0x6b, 0xab,
-      0xf0, 0xdc, 0x0e, 0xd2, 0x29, 0x91, 0x5d, 0x1a,
-      0x8f, 0x49, 0x6d, 0xf2, 0xa2, 0xa0, 0x98, 0x71 },
     { 0xec, 0x27, 0x05, 0x63, 0xb0, 0x5a, 0x06, 0xe5,
       0xaa, 0xa5, 0xe6, 0xd5, 0xbb, 0xcc, 0x17, 0xcd,
       0x1c, 0xb5, 0xb2, 0xa9, 0x4d, 0x93, 0x84, 0x75,
@@ -3534,10 +3094,6 @@
       0x51, 0x6b, 0xf6, 0x39, 0x5d, 0xbd, 0x29, 0x33,
       0x7c, 0xfc, 0xb7, 0xd4, 0x26, 0x64, 0x10, 0xa1,
       0xf5, 0xda, 0x08, 0x08, 0xe0, 0x96, 0xf4, 0x55 },
-    { 0xef, 0x7e, 0x8c, 0xcd, 0x7b, 0xcf, 0xb7, 0x1d,
-      0x2a, 0xa7, 0xbc, 0xdd, 0x8f, 0xd2, 0xd2, 0xd1,
-      0x55, 0x77, 0x9d, 0xe8, 0x68, 0x43, 0x20, 0x44,
-      0x35, 0x1e, 0x98, 0x02, 0xcc, 0xa2, 0x90, 0xaf },
     { 0xef, 0xaf, 0xca, 0x84, 0x90, 0x30, 0x7b, 0x0f,
       0x62, 0x2b, 0xf4, 0x3a, 0x0e, 0xb3, 0xc5, 0x1a,
       0xcb, 0xdd, 0xde, 0xdc, 0x23, 0x92, 0xf1, 0x61,
@@ -3554,10 +3110,6 @@
       0x8d, 0x77, 0x2e, 0xba, 0xfa, 0x5b, 0xf5, 0x32,
       0x92, 0x47, 0x77, 0x88, 0xdc, 0x12, 0x80, 0x32,
       0x76, 0xb0, 0x00, 0xc4, 0x41, 0x91, 0x03, 0xf0 },
-    { 0xf0, 0x15, 0x95, 0xf5, 0xa4, 0x66, 0x88, 0x78,
-      0xf6, 0xc7, 0x98, 0xa5, 0xd2, 0xf1, 0x35, 0x23,
-      0xf3, 0xaf, 0xb2, 0x0e, 0xf7, 0x6f, 0xe5, 0x77,
-      0x6f, 0xce, 0x47, 0xd3, 0x40, 0x9d, 0xf3, 0xc2 },
     { 0xf0, 0x2f, 0x9d, 0xa4, 0x5d, 0x9e, 0xb9, 0x86,
       0x19, 0x4e, 0x06, 0xf5, 0xe6, 0x18, 0x95, 0x45,
       0x12, 0xc9, 0x02, 0x6e, 0x7c, 0xa7, 0xb5, 0x1e,
@@ -3586,10 +3138,6 @@
       0x26, 0xaa, 0x5a, 0x6b, 0xf5, 0xc4, 0xde, 0x59,
       0x1c, 0xf1, 0x65, 0x0f, 0xa8, 0x22, 0xf1, 0x34,
       0xd9, 0x2d, 0x54, 0x8f, 0x15, 0x77, 0x73, 0xd6 },
-    { 0xf2, 0x06, 0x59, 0x72, 0x49, 0x8d, 0x5e, 0x12,
-      0x79, 0x8e, 0x1e, 0x1f, 0xf3, 0xe1, 0x1d, 0xe4,
-      0x23, 0x3a, 0xbb, 0xbd, 0x30, 0x8a, 0x58, 0x07,
-      0x60, 0x58, 0x48, 0x18, 0x6e, 0x44, 0x11, 0x7f },
     { 0xf2, 0x54, 0x76, 0xf3, 0xab, 0x8e, 0x5e, 0x0b,
       0x9b, 0xb6, 0x1d, 0x4c, 0xe4, 0x50, 0x7f, 0xa3,
       0x52, 0x93, 0xc6, 0x64, 0x15, 0xd7, 0xd1, 0x91,
@@ -3634,10 +3182,6 @@
       0xd3, 0xc5, 0x60, 0x17, 0x6f, 0x3d, 0x77, 0xfd,
       0xc5, 0x1e, 0x5f, 0x57, 0xb5, 0xe4, 0x8a, 0xe7,
       0xa4, 0xb9, 0x70, 0x0a, 0x11, 0xd4, 0x69, 0x3a },
-    { 0xf6, 0x41, 0xe7, 0xe0, 0x1b, 0xf4, 0xf2, 0xb0,
-      0xd0, 0xc4, 0x8b, 0xa6, 0x38, 0xa0, 0x2e, 0x26,
-      0xbd, 0xdb, 0xd7, 0x7b, 0xc5, 0xe9, 0x72, 0x61,
-      0x94, 0xdb, 0x1a, 0xea, 0x4f, 0x2f, 0xd7, 0x71 },
     { 0xf6, 0x54, 0x6b, 0x2f, 0xfe, 0x2b, 0xae, 0xf7,
       0x35, 0xe8, 0x25, 0x67, 0xa6, 0xe2, 0x36, 0x75,
       0x03, 0x94, 0xc1, 0x19, 0x14, 0x09, 0x87, 0x0c,
@@ -3698,10 +3242,6 @@
       0xad, 0x25, 0x74, 0x25, 0xaa, 0xe7, 0x20, 0x01,
       0x40, 0x05, 0xb4, 0x15, 0x91, 0x2d, 0xbb, 0x8c,
       0x0b, 0xc9, 0x99, 0xaf, 0x48, 0x48, 0xcf, 0xe5 },
-    { 0xf9, 0x0e, 0x7c, 0x21, 0x81, 0xba, 0x53, 0x4d,
-      0xcf, 0x5b, 0xb6, 0xdb, 0xf7, 0xf9, 0xad, 0xa3,
-      0xff, 0x98, 0xde, 0x50, 0x0c, 0xbd, 0x42, 0x12,
-      0xc0, 0xd1, 0xfa, 0x05, 0x82, 0x80, 0xfd, 0x57 },
     { 0xf9, 0xa7, 0xdd, 0xd3, 0xff, 0x51, 0xaf, 0x30,
       0x7f, 0x95, 0x4f, 0x7b, 0x44, 0xdb, 0xd2, 0x42,
       0x83, 0xcf, 0x97, 0xb6, 0x25, 0xbe, 0x76, 0x6b,
@@ -3714,10 +3254,6 @@
       0xa7, 0x9b, 0x05, 0x48, 0x67, 0x6c, 0x18, 0x48,
       0x5a, 0xf1, 0x10, 0x4c, 0xca, 0x9b, 0xb6, 0xb8,
       0xdd, 0x9b, 0x5a, 0x54, 0x3c, 0xb6, 0xc6, 0x2e },
-    { 0xfa, 0xe4, 0x72, 0x1e, 0x39, 0x47, 0xa5, 0x0d,
-      0xd0, 0x4d, 0x16, 0xac, 0xef, 0xf3, 0x55, 0xc0,
-      0x87, 0xb7, 0xe2, 0x24, 0x6b, 0xe6, 0x0f, 0xbc,
-      0x26, 0x2a, 0x53, 0x52, 0xad, 0xac, 0x18, 0x01 },
     { 0xfb, 0x44, 0x15, 0x70, 0x4c, 0x1d, 0x61, 0x55,
       0x10, 0x6d, 0x88, 0xf3, 0xb2, 0x0f, 0xec, 0x9f,
       0x6e, 0x82, 0x0c, 0x82, 0x24, 0xfe, 0xe3, 0x5e,
@@ -3750,10 +3286,6 @@
       0xd0, 0xa9, 0xdf, 0xcc, 0xe9, 0x03, 0x12, 0xc7,
       0x52, 0xe1, 0xb5, 0x2e, 0xb6, 0x54, 0xc4, 0x2c,
       0x36, 0x94, 0x4b, 0x90, 0x2a, 0x30, 0x41, 0x07 },
-    { 0xfc, 0x55, 0x86, 0x91, 0xda, 0xff, 0xe1, 0xe3,
-      0x53, 0x8d, 0x38, 0xa6, 0xd3, 0xa9, 0xe6, 0xe7,
-      0xc9, 0x9d, 0x24, 0x0c, 0x86, 0x89, 0x66, 0x73,
-      0x56, 0x27, 0x99, 0x72, 0xfb, 0x4f, 0x30, 0x85 },
     { 0xfc, 0x56, 0xdb, 0xa1, 0xe7, 0xaf, 0xbd, 0xaa,
       0x07, 0x33, 0xc6, 0x91, 0x1c, 0x5f, 0x1f, 0x18,
       0x28, 0xcb, 0x12, 0x98, 0x31, 0x40, 0x1a, 0x3c,
@@ -3832,14 +3364,6 @@
       0xaf, 0x3f, 0x5c, 0xf4, 0x22, 0x5a, 0x8e, 0xaf },
 };
 const uint8_t kCNNICEVWhitelist[][crypto::kSHA256Length] = {
-    { 0x0e, 0x56, 0x71, 0x6d, 0xd3, 0xc1, 0x83, 0xaa,
-      0x5d, 0xe0, 0xd3, 0x96, 0x89, 0x88, 0x94, 0xf0,
-      0x03, 0xaa, 0xff, 0x06, 0x2e, 0x15, 0x82, 0x33,
-      0xef, 0xfb, 0x5b, 0xc9, 0xe8, 0x33, 0x71, 0x4b },
-    { 0x0f, 0x07, 0xaa, 0xd7, 0xac, 0x55, 0x6f, 0x85,
-      0x86, 0xcb, 0xf3, 0x47, 0x8f, 0x2e, 0xc0, 0xb5,
-      0x29, 0xca, 0x46, 0x5b, 0x19, 0x3f, 0xc2, 0xa6,
-      0xe1, 0x93, 0x28, 0x3a, 0xd8, 0xd7, 0xa5, 0x50 },
     { 0x23, 0x86, 0x51, 0xab, 0x70, 0xb7, 0x11, 0xa0,
       0x65, 0x55, 0x4e, 0x5d, 0x63, 0x6a, 0x34, 0x2c,
       0x8a, 0x6b, 0xfe, 0x46, 0x0e, 0x4e, 0x7b, 0x4c,
@@ -3852,18 +3376,10 @@
       0xaa, 0x33, 0x43, 0x60, 0xa6, 0x6a, 0xc3, 0xa7,
       0x3f, 0xa8, 0xd8, 0xd3, 0x60, 0x0d, 0x89, 0x4e,
       0xb0, 0xc7, 0xd2, 0x84, 0x23, 0xc6, 0x78, 0x57 },
-    { 0x61, 0xa7, 0x62, 0xef, 0x47, 0xbc, 0xa4, 0xee,
-      0x77, 0xa5, 0xc8, 0xaf, 0x03, 0x98, 0x9a, 0x9d,
-      0xea, 0xca, 0x4d, 0x82, 0x8a, 0x53, 0xd9, 0x23,
-      0xe7, 0x0b, 0xfb, 0xc7, 0x25, 0x4a, 0xc7, 0x70 },
     { 0x63, 0x80, 0x65, 0xec, 0x95, 0xf1, 0xea, 0x81,
       0xd9, 0x5b, 0xa4, 0xdb, 0x9e, 0xa9, 0xa2, 0xef,
       0xe2, 0xd6, 0xcd, 0x78, 0x75, 0x88, 0x67, 0x04,
       0x5c, 0x06, 0xb6, 0x48, 0xa5, 0xda, 0x89, 0xb2 },
-    { 0x67, 0xc3, 0xc0, 0xa1, 0x60, 0xe9, 0x28, 0x5e,
-      0x35, 0xa4, 0x22, 0xbb, 0x43, 0x4b, 0xff, 0xff,
-      0xee, 0x28, 0x79, 0xc6, 0xc0, 0xa5, 0x69, 0x36,
-      0x56, 0xe7, 0x73, 0xa6, 0xdd, 0x68, 0x5f, 0x0e },
     { 0x80, 0xf3, 0xeb, 0x58, 0xea, 0x6a, 0xa2, 0x85,
       0x11, 0xb0, 0x9b, 0x68, 0xf2, 0xde, 0xf9, 0xb4,
       0xaf, 0xa9, 0x9c, 0x97, 0x44, 0xc0, 0xbe, 0x4e,
@@ -3880,10 +3396,6 @@
       0xb2, 0x7c, 0x6a, 0x62, 0xe3, 0xc4, 0x23, 0x5b,
       0xd8, 0x3c, 0xc5, 0xe0, 0x06, 0xe9, 0x2a, 0x55,
       0xe4, 0xa9, 0x86, 0xe6, 0x30, 0x53, 0x57, 0xe3 },
-    { 0xaf, 0xbb, 0x40, 0x3c, 0xad, 0x0d, 0x19, 0xcc,
-      0x26, 0xae, 0x5b, 0x1e, 0x31, 0x0a, 0xc1, 0xae,
-      0x79, 0x47, 0x1b, 0xad, 0x2b, 0xd7, 0x7b, 0xe4,
-      0x0f, 0x12, 0x50, 0x4c, 0x42, 0xe5, 0x22, 0x0b },
     { 0xb2, 0xba, 0x3b, 0x49, 0xb8, 0xe5, 0x84, 0x51,
       0x81, 0x6b, 0x10, 0x83, 0x6c, 0x4f, 0x1c, 0xa6,
       0xa3, 0x39, 0x37, 0xce, 0xb8, 0xf0, 0xc0, 0x4b,
@@ -3908,10 +3420,6 @@
       0x23, 0xb9, 0xa9, 0x60, 0xb5, 0xe9, 0x67, 0x0c,
       0xcc, 0x34, 0x6d, 0x89, 0x93, 0x8f, 0xfa, 0x5d,
       0xf7, 0x98, 0x65, 0xe4, 0x13, 0xd6, 0x31, 0x54 },
-    { 0xee, 0x3d, 0x0b, 0xc5, 0xa6, 0x5a, 0xf5, 0x8d,
-      0x43, 0x2d, 0x08, 0x63, 0x7b, 0xe0, 0xb7, 0xba,
-      0x49, 0xc2, 0x32, 0x61, 0x8d, 0xa9, 0xc8, 0x97,
-      0x3f, 0x88, 0x56, 0x8c, 0x88, 0x89, 0xd1, 0xad },
     { 0xf3, 0xcb, 0x8e, 0xa4, 0xe8, 0xf2, 0xa7, 0x00,
       0x9c, 0x23, 0x3a, 0x64, 0x88, 0x71, 0xdb, 0x46,
       0x04, 0xd5, 0x45, 0x4b, 0xc5, 0x55, 0x9e, 0x9b,
diff --git a/net/test/url_request/url_request_failed_job.cc b/net/test/url_request/url_request_failed_job.cc
index d7c479b..e4ac6a6 100644
--- a/net/test/url_request/url_request_failed_job.cc
+++ b/net/test/url_request/url_request_failed_job.cc
@@ -97,20 +97,40 @@
 }
 
 void URLRequestFailedJob::Start() {
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::Bind(&URLRequestFailedJob::StartAsync, weak_factory_.GetWeakPtr()));
+  if (phase_ == START) {
+    if (net_error_ != ERR_IO_PENDING) {
+      NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, net_error_));
+      return;
+    }
+    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+    return;
+  }
+  response_info_.headers = new net::HttpResponseHeaders("HTTP/1.1 200 OK");
+  NotifyHeadersComplete();
 }
 
-int URLRequestFailedJob::ReadRawData(IOBuffer* buf, int buf_size) {
+bool URLRequestFailedJob::ReadRawData(IOBuffer* buf,
+                                      int buf_size,
+                                      int* bytes_read) {
   CHECK(phase_ == READ_SYNC || phase_ == READ_ASYNC);
-  if (net_error_ == ERR_IO_PENDING || phase_ == READ_SYNC)
-    return net_error_;
+  if (net_error_ != ERR_IO_PENDING && phase_ == READ_SYNC) {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, net_error_));
+    return false;
+  }
+
+  SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+
+  if (net_error_ == ERR_IO_PENDING)
+    return false;
+
+  DCHECK_EQ(READ_ASYNC, phase_);
+  DCHECK_NE(ERR_IO_PENDING, net_error_);
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&URLRequestFailedJob::ReadRawDataComplete,
-                            weak_factory_.GetWeakPtr(), net_error_));
-  return ERR_IO_PENDING;
+      FROM_HERE,
+      base::Bind(&URLRequestFailedJob::NotifyDone, weak_factory_.GetWeakPtr(),
+                 URLRequestStatus(URLRequestStatus::FAILED, net_error_)));
+  return false;
 }
 
 int URLRequestFailedJob::GetResponseCode() const {
@@ -175,17 +195,4 @@
 URLRequestFailedJob::~URLRequestFailedJob() {
 }
 
-void URLRequestFailedJob::StartAsync() {
-  if (phase_ == START) {
-    if (net_error_ != ERR_IO_PENDING) {
-      NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, net_error_));
-      return;
-    }
-    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
-    return;
-  }
-  response_info_.headers = new net::HttpResponseHeaders("HTTP/1.1 200 OK");
-  NotifyHeadersComplete();
-}
-
 }  // namespace net
diff --git a/net/test/url_request/url_request_failed_job.h b/net/test/url_request/url_request_failed_job.h
index 45b1911..0413111 100644
--- a/net/test/url_request/url_request_failed_job.h
+++ b/net/test/url_request/url_request_failed_job.h
@@ -39,7 +39,7 @@
 
   // URLRequestJob implementation:
   void Start() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   int GetResponseCode() const override;
   void GetResponseInfo(HttpResponseInfo* info) override;
 
@@ -71,7 +71,6 @@
 
  protected:
   ~URLRequestFailedJob() override;
-  void StartAsync();
 
  private:
   HttpResponseInfo response_info_;
diff --git a/net/test/url_request/url_request_mock_data_job.cc b/net/test/url_request/url_request_mock_data_job.cc
index b9ef385b..9549242 100644
--- a/net/test/url_request/url_request_mock_data_job.cc
+++ b/net/test/url_request/url_request_mock_data_job.cc
@@ -104,12 +104,15 @@
 URLRequestMockDataJob::~URLRequestMockDataJob() {
 }
 
-int URLRequestMockDataJob::ReadRawData(IOBuffer* buf, int buf_size) {
-  int bytes_read =
-      std::min(static_cast<size_t>(buf_size), data_.length() - data_offset_);
-  memcpy(buf->data(), data_.c_str() + data_offset_, bytes_read);
-  data_offset_ += bytes_read;
-  return bytes_read;
+bool URLRequestMockDataJob::ReadRawData(IOBuffer* buf,
+                                        int buf_size,
+                                        int* bytes_read) {
+  DCHECK(bytes_read);
+  *bytes_read = static_cast<int>(
+      std::min(static_cast<size_t>(buf_size), data_.length() - data_offset_));
+  memcpy(buf->data(), data_.c_str() + data_offset_, *bytes_read);
+  data_offset_ += *bytes_read;
+  return true;
 }
 
 int URLRequestMockDataJob::GetResponseCode() const {
diff --git a/net/test/url_request/url_request_mock_data_job.h b/net/test/url_request/url_request_mock_data_job.h
index 14ad665..3d84e37 100644
--- a/net/test/url_request/url_request_mock_data_job.h
+++ b/net/test/url_request/url_request_mock_data_job.h
@@ -24,7 +24,7 @@
                         int data_repeat_count);
 
   void Start() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   int GetResponseCode() const override;
   void GetResponseInfo(HttpResponseInfo* info) override;
 
diff --git a/net/test/url_request/url_request_slow_download_job.cc b/net/test/url_request/url_request_slow_download_job.cc
index 52fd71c..f344feb 100644
--- a/net/test/url_request/url_request_slow_download_job.cc
+++ b/net/test/url_request/url_request_slow_download_job.cc
@@ -179,34 +179,39 @@
   return REQUEST_COMPLETE;
 }
 
-int URLRequestSlowDownloadJob::ReadRawData(IOBuffer* buf, int buf_size) {
+bool URLRequestSlowDownloadJob::ReadRawData(IOBuffer* buf,
+                                            int buf_size,
+                                            int* bytes_read) {
   if (base::LowerCaseEqualsASCII(kFinishDownloadUrl,
                                  request_->url().spec().c_str()) ||
       base::LowerCaseEqualsASCII(kErrorDownloadUrl,
                                  request_->url().spec().c_str())) {
     VLOG(10) << __FUNCTION__ << " called w/ kFinish/ErrorDownloadUrl.";
-    return 0;
+    *bytes_read = 0;
+    return true;
   }
 
   VLOG(10) << __FUNCTION__ << " called at position " << bytes_already_sent_
            << " in the stream.";
-  int bytes_read = 0;
-  ReadStatus status = FillBufferHelper(buf, buf_size, &bytes_read);
+  ReadStatus status = FillBufferHelper(buf, buf_size, bytes_read);
   switch (status) {
     case BUFFER_FILLED:
-    case REQUEST_COMPLETE:
-      return bytes_read;
+      return true;
     case REQUEST_BLOCKED:
       buffer_ = buf;
       buffer_size_ = buf_size;
+      SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
       base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
           FROM_HERE, base::Bind(&URLRequestSlowDownloadJob::CheckDoneStatus,
                                 weak_factory_.GetWeakPtr()),
           base::TimeDelta::FromMilliseconds(100));
-      return ERR_IO_PENDING;
+      return false;
+    case REQUEST_COMPLETE:
+      *bytes_read = 0;
+      return true;
   }
   NOTREACHED();
-  return OK;
+  return true;
 }
 
 void URLRequestSlowDownloadJob::CheckDoneStatus() {
@@ -218,10 +223,12 @@
         FillBufferHelper(buffer_.get(), buffer_size_, &bytes_written);
     DCHECK_EQ(BUFFER_FILLED, status);
     buffer_ = NULL;  // Release the reference.
-    ReadRawDataComplete(bytes_written);
+    SetStatus(URLRequestStatus());
+    NotifyReadComplete(bytes_written);
   } else if (should_error_download_) {
     VLOG(10) << __FUNCTION__ << " called w/ should_finish_ownload_ set.";
-    ReadRawDataComplete(ERR_CONNECTION_RESET);
+    NotifyDone(
+        URLRequestStatus(URLRequestStatus::FAILED, ERR_CONNECTION_RESET));
   } else {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE, base::Bind(&URLRequestSlowDownloadJob::CheckDoneStatus,
diff --git a/net/test/url_request/url_request_slow_download_job.h b/net/test/url_request/url_request_slow_download_job.h
index fcd7f661b..115a6ac 100644
--- a/net/test/url_request/url_request_slow_download_job.h
+++ b/net/test/url_request/url_request_slow_download_job.h
@@ -37,7 +37,7 @@
   void Start() override;
   bool GetMimeType(std::string* mime_type) const override;
   void GetResponseInfo(HttpResponseInfo* info) override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   // Returns the current number of URLRequestSlowDownloadJobs that have
   // not yet completed.
diff --git a/net/url_request/url_request_file_dir_job.cc b/net/url_request/url_request_file_dir_job.cc
index 1dafbf2..114672ea 100644
--- a/net/url_request/url_request_file_dir_job.cc
+++ b/net/url_request/url_request_file_dir_job.cc
@@ -13,6 +13,7 @@
 #include "base/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
 #include "net/base/net_util.h"
 #include "net/url_request/url_request_status.h"
 #include "url/gurl.h"
@@ -65,19 +66,24 @@
   weak_factory_.InvalidateWeakPtrs();
 }
 
-int URLRequestFileDirJob::ReadRawData(IOBuffer* buf, int buf_size) {
-  if (is_done())
-    return 0;
+bool URLRequestFileDirJob::ReadRawData(IOBuffer* buf,
+                                       int buf_size,
+                                       int* bytes_read) {
+  DCHECK(bytes_read);
+  *bytes_read = 0;
 
-  int bytes_read = 0;
-  if (FillReadBuffer(buf->data(), buf_size, &bytes_read))
-    return bytes_read;
+  if (is_done())
+    return true;
+
+  if (FillReadBuffer(buf->data(), buf_size, bytes_read))
+    return true;
 
   // We are waiting for more data
   read_pending_ = true;
   read_buffer_ = buf;
   read_buffer_length_ = buf_size;
-  return ERR_IO_PENDING;
+  SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+  return false;
 }
 
 bool URLRequestFileDirJob::GetMimeType(std::string* mime_type) const {
@@ -126,45 +132,40 @@
       data.info.GetLastModifiedTime()));
 
   // TODO(darin): coalesce more?
-  CompleteRead(OK);
+  CompleteRead();
 }
 
 void URLRequestFileDirJob::OnListDone(int error) {
   DCHECK(!canceled_);
-  DCHECK_LE(error, OK);
-  if (error == OK)
+  if (error != OK) {
+    read_pending_ = false;
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, error));
+  } else {
     list_complete_ = true;
-  CompleteRead(static_cast<Error>(error));
+    CompleteRead();
+  }
 }
 
 URLRequestFileDirJob::~URLRequestFileDirJob() {}
 
-void URLRequestFileDirJob::CompleteRead(Error status) {
-  DCHECK_LE(status, OK);
-  DCHECK_NE(status, ERR_IO_PENDING);
-
-  // Do nothing if there is no read pending.
-  if (!read_pending_)
-    return;
-
-  int result = status;
-  if (status == OK) {
-    int filled_bytes = 0;
+void URLRequestFileDirJob::CompleteRead() {
+  if (read_pending_) {
+    int bytes_read;
     if (FillReadBuffer(read_buffer_->data(), read_buffer_length_,
-                       &filled_bytes)) {
-      result = filled_bytes;
+                       &bytes_read)) {
       // We completed the read, so reset the read buffer.
+      read_pending_ = false;
       read_buffer_ = NULL;
       read_buffer_length_ = 0;
+
+      SetStatus(URLRequestStatus());
+      NotifyReadComplete(bytes_read);
     } else {
       NOTREACHED();
       // TODO: Better error code.
-      result = ERR_FAILED;
+      NotifyDone(URLRequestStatus::FromError(ERR_FAILED));
     }
   }
-
-  read_pending_ = false;
-  ReadRawDataComplete(result);
 }
 
 bool URLRequestFileDirJob::FillReadBuffer(char* buf, int buf_size,
diff --git a/net/url_request/url_request_file_dir_job.h b/net/url_request/url_request_file_dir_job.h
index f7a7b45..067db81e 100644
--- a/net/url_request/url_request_file_dir_job.h
+++ b/net/url_request/url_request_file_dir_job.h
@@ -10,7 +10,6 @@
 #include "base/files/file_path.h"
 #include "base/memory/weak_ptr.h"
 #include "net/base/directory_lister.h"
-#include "net/base/net_errors.h"
 #include "net/url_request/url_request_job.h"
 
 namespace net {
@@ -30,7 +29,7 @@
   // Overridden from URLRequestJob:
   void Start() override;
   void Kill() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetMimeType(std::string* mime_type) const override;
   bool GetCharset(std::string* charset) override;
 
@@ -46,7 +45,7 @@
   // When we have data and a read has been pending, this function
   // will fill the response buffer and notify the request
   // appropriately.
-  void CompleteRead(Error error);
+  void CompleteRead();
 
   // Fills a buffer with the output.
   bool FillReadBuffer(char* buf, int buf_size, int* bytes_read);
@@ -68,7 +67,6 @@
   bool read_pending_;
   scoped_refptr<IOBuffer> read_buffer_;
   int read_buffer_length_;
-
   base::WeakPtrFactory<URLRequestFileDirJob> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(URLRequestFileDirJob);
diff --git a/net/url_request/url_request_file_job.cc b/net/url_request/url_request_file_job.cc
index 2c5cf6a6..06e1ba6b 100644
--- a/net/url_request/url_request_file_job.cc
+++ b/net/url_request/url_request_file_job.cc
@@ -33,6 +33,7 @@
 #include "net/base/io_buffer.h"
 #include "net/base/load_flags.h"
 #include "net/base/mime_util.h"
+#include "net/base/net_errors.h"
 #include "net/filter/filter.h"
 #include "net/http/http_util.h"
 #include "net/url_request/url_request_error_job.h"
@@ -62,7 +63,6 @@
       stream_(new FileStream(file_task_runner)),
       file_task_runner_(file_task_runner),
       remaining_bytes_(0),
-      range_parse_result_(OK),
       weak_ptr_factory_(this) {}
 
 void URLRequestFileJob::Start() {
@@ -83,17 +83,22 @@
   URLRequestJob::Kill();
 }
 
-int URLRequestFileJob::ReadRawData(IOBuffer* dest, int dest_size) {
+bool URLRequestFileJob::ReadRawData(IOBuffer* dest,
+                                    int dest_size,
+                                    int* bytes_read) {
   DCHECK_NE(dest_size, 0);
+  DCHECK(bytes_read);
   DCHECK_GE(remaining_bytes_, 0);
 
   if (remaining_bytes_ < dest_size)
-    dest_size = remaining_bytes_;
+    dest_size = static_cast<int>(remaining_bytes_);
 
   // If we should copy zero bytes because |remaining_bytes_| is zero, short
   // circuit here.
-  if (!dest_size)
-    return 0;
+  if (!dest_size) {
+    *bytes_read = 0;
+    return true;
+  }
 
   int rv = stream_->Read(dest,
                          dest_size,
@@ -101,11 +106,20 @@
                                     weak_ptr_factory_.GetWeakPtr(),
                                     make_scoped_refptr(dest)));
   if (rv >= 0) {
+    // Data is immediately available.
+    *bytes_read = rv;
     remaining_bytes_ -= rv;
     DCHECK_GE(remaining_bytes_, 0);
+    return true;
   }
 
-  return rv;
+  // Otherwise, a read error occured.  We may just need to wait...
+  if (rv == ERR_IO_PENDING) {
+    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+  } else {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
+  }
+  return false;
 }
 
 bool URLRequestFileJob::IsRedirectResponse(GURL* location,
@@ -165,10 +179,7 @@
     const HttpRequestHeaders& headers) {
   std::string range_header;
   if (headers.GetHeader(HttpRequestHeaders::kRange, &range_header)) {
-    // This job only cares about the Range header. This method stashes the value
-    // for later use in DidOpen(), which is responsible for some of the range
-    // validation as well. NotifyStartError is not legal to call here since
-    // the job has not started.
+    // We only care about "Range" header here.
     std::vector<HttpByteRange> ranges;
     if (HttpUtil::ParseRangeHeader(range_header, &ranges)) {
       if (ranges.size() == 1) {
@@ -178,7 +189,8 @@
         // because we need to do multipart encoding here.
         // TODO(hclam): decide whether we want to support multiple range
         // requests.
-        range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
+        NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+                                    ERR_REQUEST_RANGE_NOT_SATISFIABLE));
       }
     }
   }
@@ -239,19 +251,13 @@
 
 void URLRequestFileJob::DidOpen(int result) {
   if (result != OK) {
-    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, result));
-    return;
-  }
-
-  if (range_parse_result_ != net::OK) {
-    NotifyStartError(
-        URLRequestStatus(URLRequestStatus::FAILED, range_parse_result_));
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
     return;
   }
 
   if (!byte_range_.ComputeBounds(meta_info_.file_size)) {
-    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED,
-                                      net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+                                ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     return;
   }
 
@@ -279,8 +285,8 @@
 void URLRequestFileJob::DidSeek(int64 result) {
   OnSeekComplete(result);
   if (result != byte_range_.first_byte_position()) {
-    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED,
-                                      ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+                                ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     return;
   }
 
@@ -289,7 +295,8 @@
 }
 
 void URLRequestFileJob::DidRead(scoped_refptr<IOBuffer> buf, int result) {
-  if (result >= 0) {
+  if (result > 0) {
+    SetStatus(URLRequestStatus());  // Clear the IO_PENDING status
     remaining_bytes_ -= result;
     DCHECK_GE(remaining_bytes_, 0);
   }
@@ -297,7 +304,13 @@
   OnReadComplete(buf.get(), result);
   buf = NULL;
 
-  ReadRawDataComplete(result);
+  if (result == 0) {
+    NotifyDone(URLRequestStatus());
+  } else if (result < 0) {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
+  }
+
+  NotifyReadComplete(result);
 }
 
 }  // namespace net
diff --git a/net/url_request/url_request_file_job.h b/net/url_request/url_request_file_job.h
index 97c6c21..0436dac5 100644
--- a/net/url_request/url_request_file_job.h
+++ b/net/url_request/url_request_file_job.h
@@ -11,7 +11,6 @@
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "net/base/net_errors.h"
 #include "net/base/net_export.h"
 #include "net/http/http_byte_range.h"
 #include "net/url_request/url_request.h"
@@ -39,7 +38,7 @@
   // URLRequestJob:
   void Start() override;
   void Kill() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool IsRedirectResponse(GURL* location, int* http_status_code) override;
   Filter* SetupFilter() const override;
   bool GetMimeType(std::string* mime_type) const override;
@@ -98,12 +97,9 @@
   FileMetaInfo meta_info_;
   const scoped_refptr<base::TaskRunner> file_task_runner_;
 
-  std::vector<HttpByteRange> byte_ranges_;
   HttpByteRange byte_range_;
   int64 remaining_bytes_;
 
-  Error range_parse_result_;
-
   base::WeakPtrFactory<URLRequestFileJob> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(URLRequestFileJob);
diff --git a/net/url_request/url_request_ftp_job.cc b/net/url_request/url_request_ftp_job.cc
index e422d03..3a088bd 100644
--- a/net/url_request/url_request_ftp_job.cc
+++ b/net/url_request/url_request_ftp_job.cc
@@ -239,7 +239,7 @@
     HandleAuthNeededResponse();
     return;
   } else {
-    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, result));
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
   }
 }
 
@@ -251,7 +251,15 @@
 
 void URLRequestFtpJob::OnReadCompleted(int result) {
   read_in_progress_ = false;
-  ReadRawDataComplete(result);
+  if (result == 0) {
+    NotifyDone(URLRequestStatus());
+  } else if (result < 0) {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
+  } else {
+    // Clear the IO_PENDING status
+    SetStatus(URLRequestStatus());
+  }
+  NotifyReadComplete(result);
 }
 
 void URLRequestFtpJob::RestartTransactionWithAuth() {
@@ -344,12 +352,14 @@
   return UploadProgress();
 }
 
-int URLRequestFtpJob::ReadRawData(IOBuffer* buf, int buf_size) {
+bool URLRequestFtpJob::ReadRawData(IOBuffer* buf,
+                                   int buf_size,
+                                   int* bytes_read) {
   DCHECK_NE(buf_size, 0);
+  DCHECK(bytes_read);
   DCHECK(!read_in_progress_);
 
   int rv;
-
   if (proxy_info_.is_direct()) {
     rv = ftp_transaction_->Read(buf, buf_size,
                                 base::Bind(&URLRequestFtpJob::OnReadCompleted,
@@ -360,9 +370,18 @@
                                             base::Unretained(this)));
   }
 
-  if (rv == ERR_IO_PENDING)
+  if (rv >= 0) {
+    *bytes_read = rv;
+    return true;
+  }
+
+  if (rv == ERR_IO_PENDING) {
     read_in_progress_ = true;
-  return rv;
+    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+  } else {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
+  }
+  return false;
 }
 
 void URLRequestFtpJob::HandleAuthNeededResponse() {
diff --git a/net/url_request/url_request_ftp_job.h b/net/url_request/url_request_ftp_job.h
index 6315d8f..74caf726 100644
--- a/net/url_request/url_request_ftp_job.h
+++ b/net/url_request/url_request_ftp_job.h
@@ -71,7 +71,7 @@
 
   // TODO(ibrar):  Yet to give another look at this function.
   UploadProgress GetUploadProgress() const override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
 
   void HandleAuthNeededResponse();
 
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 13365df..dac461d 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -414,6 +414,11 @@
   URLRequestJob::NotifyHeadersComplete();
 }
 
+void URLRequestHttpJob::NotifyDone(const URLRequestStatus& status) {
+  DoneWithRequest(FINISHED);
+  URLRequestJob::NotifyDone(status);
+}
+
 void URLRequestHttpJob::DestroyTransaction() {
   DCHECK(transaction_.get());
 
@@ -993,16 +998,19 @@
 void URLRequestHttpJob::OnReadCompleted(int result) {
   read_in_progress_ = false;
 
-  DCHECK_NE(ERR_IO_PENDING, result);
-
   if (ShouldFixMismatchedContentLength(result))
     result = OK;
 
-  // EOF or error, done with this job.
-  if (result <= 0)
-    DoneWithRequest(FINISHED);
+  if (result == OK) {
+    NotifyDone(URLRequestStatus());
+  } else if (result < 0) {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result));
+  } else {
+    // Clear the IO_PENDING status
+    SetStatus(URLRequestStatus());
+  }
 
-  ReadRawDataComplete(result);
+  NotifyReadComplete(result);
 }
 
 void URLRequestHttpJob::RestartTransactionWithAuth(
@@ -1326,8 +1334,11 @@
   return false;
 }
 
-int URLRequestHttpJob::ReadRawData(IOBuffer* buf, int buf_size) {
+bool URLRequestHttpJob::ReadRawData(IOBuffer* buf,
+                                    int buf_size,
+                                    int* bytes_read) {
   DCHECK_NE(buf_size, 0);
+  DCHECK(bytes_read);
   DCHECK(!read_in_progress_);
 
   int rv = transaction_->Read(
@@ -1335,15 +1346,23 @@
       base::Bind(&URLRequestHttpJob::OnReadCompleted, base::Unretained(this)));
 
   if (ShouldFixMismatchedContentLength(rv))
-    rv = OK;
+    rv = 0;
 
-  if (rv == 0 || (rv < 0 && rv != ERR_IO_PENDING))
-    DoneWithRequest(FINISHED);
+  if (rv >= 0) {
+    *bytes_read = rv;
+    if (!rv)
+      DoneWithRequest(FINISHED);
+    return true;
+  }
 
-  if (rv == ERR_IO_PENDING)
+  if (rv == ERR_IO_PENDING) {
     read_in_progress_ = true;
+    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+  } else {
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
+  }
 
-  return rv;
+  return false;
 }
 
 void URLRequestHttpJob::StopCaching() {
diff --git a/net/url_request/url_request_http_job.h b/net/url_request/url_request_http_job.h
index f9ce401..4ee4440 100644
--- a/net/url_request/url_request_http_job.h
+++ b/net/url_request/url_request_http_job.h
@@ -78,6 +78,9 @@
   // Shadows URLRequestJob's version of this method so we can grab cookies.
   void NotifyHeadersComplete();
 
+  // Shadows URLRequestJob's method so we can record histograms.
+  void NotifyDone(const URLRequestStatus& status);
+
   void DestroyTransaction();
 
   void AddExtraHeaders();
@@ -128,7 +131,7 @@
   void ContinueWithCertificate(X509Certificate* client_cert) override;
   void ContinueDespiteLastError() override;
   void ResumeNetworkStart() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   void StopCaching() override;
   bool GetFullRequestHeaders(HttpRequestHeaders* headers) const override;
   int64 GetTotalReceivedBytes() const override;
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index 14ae8e5d..812d8d8 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -101,46 +101,45 @@
   request_ = NULL;
 }
 
-// This function calls ReadRawData to get stream data. If a filter exists, it
-// passes the data to the attached filter. It then returns the output from
-// filter back to the caller.
+// This function calls ReadData to get stream data. If a filter exists, passes
+// the data to the attached filter. Then returns the output from filter back to
+// the caller.
 bool URLRequestJob::Read(IOBuffer* buf, int buf_size, int *bytes_read) {
+  bool rv = false;
+
   DCHECK_LT(buf_size, 1000000);  // Sanity check.
   DCHECK(buf);
   DCHECK(bytes_read);
   DCHECK(filtered_read_buffer_.get() == NULL);
   DCHECK_EQ(0, filtered_read_buffer_len_);
 
-  Error error = OK;
   *bytes_read = 0;
 
   // Skip Filter if not present.
-  if (!filter_) {
-    error = ReadRawDataHelper(buf, buf_size, bytes_read);
+  if (!filter_.get()) {
+    rv = ReadRawDataHelper(buf, buf_size, bytes_read);
   } else {
     // Save the caller's buffers while we do IO
     // in the filter's buffers.
     filtered_read_buffer_ = buf;
     filtered_read_buffer_len_ = buf_size;
 
-    error = ReadFilteredData(bytes_read);
+    if (ReadFilteredData(bytes_read)) {
+      rv = true;  // We have data to return.
 
-    // Synchronous EOF from the filter.
-    if (error == OK && *bytes_read == 0)
-      DoneReading();
+      // It is fine to call DoneReading even if ReadFilteredData receives 0
+      // bytes from the net, but we avoid making that call if we know for
+      // sure that's the case (ReadRawDataHelper path).
+      if (*bytes_read == 0)
+        DoneReading();
+    } else {
+      rv = false;  // Error, or a new IO is pending.
+    }
   }
 
-  if (error == OK) {
-    // If URLRequestJob read zero bytes, the job is at EOF.
-    if (*bytes_read == 0)
-      NotifyDone(URLRequestStatus());
-  } else if (error == ERR_IO_PENDING) {
-    SetStatus(URLRequestStatus::FromError(ERR_IO_PENDING));
-  } else {
-    NotifyDone(URLRequestStatus::FromError(error));
-    *bytes_read = -1;
-  }
-  return error == OK;
+  if (rv && *bytes_read == 0)
+    NotifyDone(URLRequestStatus());
+  return rv;
 }
 
 void URLRequestJob::StopCaching() {
@@ -481,25 +480,11 @@
   request_->NotifyResponseStarted();
 }
 
-void URLRequestJob::ConvertResultToError(int result, Error* error, int* count) {
-  if (result >= 0) {
-    *error = OK;
-    *count = result;
-  } else {
-    *error = static_cast<Error>(result);
-    *count = 0;
-  }
-}
-
-void URLRequestJob::ReadRawDataComplete(int result) {
+void URLRequestJob::NotifyReadComplete(int bytes_read) {
   // TODO(cbentzel): Remove ScopedTracker below once crbug.com/475755 is fixed.
   tracked_objects::ScopedTracker tracking_profile(
       FROM_HERE_WITH_EXPLICIT_FUNCTION(
-          "475755 URLRequestJob::RawReadCompleted"));
-
-  Error error;
-  int bytes_read;
-  ConvertResultToError(result, &error, &bytes_read);
+          "475755 URLRequestJob::NotifyReadComplete"));
 
   if (!request_ || !request_->has_delegate())
     return;  // The request was destroyed, so there is no more work to do.
@@ -512,32 +497,11 @@
   // The headers should be complete before reads complete
   DCHECK(has_handled_response_);
 
-  GatherRawReadStats(error, bytes_read);
+  OnRawReadComplete(bytes_read);
 
-  if (filter_.get() && error == OK) {
-    int filter_bytes_read = 0;
-    // Tell the filter that it has more data.
-    PushInputToFilter(bytes_read);
-
-    // Filter the data.
-    error = ReadFilteredData(&filter_bytes_read);
-
-    if (!filter_bytes_read)
-      DoneReading();
-
-    DVLOG(1) << __FUNCTION__ << "() "
-             << "\"" << (request_ ? request_->url().spec() : "???") << "\""
-             << " pre bytes read = " << bytes_read
-             << " pre total = " << prefilter_bytes_read_
-             << " post total = " << postfilter_bytes_read_;
-    bytes_read = filter_bytes_read;
-  } else {
-    DVLOG(1) << __FUNCTION__ << "() "
-             << "\"" << (request_ ? request_->url().spec() : "???") << "\""
-             << " pre bytes read = " << bytes_read
-             << " pre total = " << prefilter_bytes_read_
-             << " post total = " << postfilter_bytes_read_;
-  }
+  // Don't notify if we had an error.
+  if (!request_->status().is_success())
+    return;
 
   // When notifying the delegate, the delegate can release the request
   // (and thus release 'this').  After calling to the delegate, we must
@@ -546,24 +510,25 @@
   // survival until we can get out of this method.
   scoped_refptr<URLRequestJob> self_preservation(this);
 
-  // Synchronize the URLRequest state machine with the URLRequestJob state
-  // machine. If this read succeeded, either the request is at EOF and the
-  // URLRequest state machine goes to 'finished', or it is not and the
-  // URLRequest state machine goes to 'success'. If the read failed, the
-  // URLRequest state machine goes directly to 'finished'.
-  //
-  // Update the URLRequest's status first, so that NotifyReadCompleted has an
-  // accurate view of the request.
-  if (error == OK && bytes_read > 0) {
-    SetStatus(URLRequestStatus());
-  } else {
-    NotifyDone(URLRequestStatus::FromError(error));
-  }
+  if (filter_.get()) {
+    // Tell the filter that it has more data
+    FilteredDataRead(bytes_read);
 
-  // NotifyReadCompleted should be called after SetStatus or NotifyDone updates
-  // the status.
-  if (error == OK)
+    // Filter the data.
+    int filter_bytes_read = 0;
+    if (ReadFilteredData(&filter_bytes_read)) {
+      if (!filter_bytes_read)
+        DoneReading();
+      request_->NotifyReadCompleted(filter_bytes_read);
+    }
+  } else {
     request_->NotifyReadCompleted(bytes_read);
+  }
+  DVLOG(1) << __FUNCTION__ << "() "
+           << "\"" << (request_ ? request_->url().spec() : "???") << "\""
+           << " pre bytes read = " << bytes_read
+           << " pre total = " << prefilter_bytes_read_
+           << " post total = " << postfilter_bytes_read_;
 }
 
 void URLRequestJob::NotifyStartError(const URLRequestStatus &status) {
@@ -590,7 +555,7 @@
   // the response before getting here.
   DCHECK(has_handled_response_ || !status.is_success());
 
-  // As with RawReadCompleted, we need to take care to notice if we were
+  // As with NotifyReadComplete, we need to take care to notice if we were
   // destroyed during a delegate callback.
   if (request_) {
     request_->set_is_pending(false);
@@ -673,8 +638,10 @@
   request_->OnCallToDelegateComplete();
 }
 
-int URLRequestJob::ReadRawData(IOBuffer* buf, int buf_size) {
-  return 0;
+bool URLRequestJob::ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) {
+  DCHECK(bytes_read);
+  *bytes_read = 0;
+  return true;
 }
 
 void URLRequestJob::DoneReading() {
@@ -684,34 +651,38 @@
 void URLRequestJob::DoneReadingRedirectResponse() {
 }
 
-void URLRequestJob::PushInputToFilter(int bytes_read) {
+void URLRequestJob::FilteredDataRead(int bytes_read) {
   DCHECK(filter_);
   filter_->FlushStreamBuffer(bytes_read);
 }
 
-Error URLRequestJob::ReadFilteredData(int* bytes_read) {
+bool URLRequestJob::ReadFilteredData(int* bytes_read) {
   DCHECK(filter_);
   DCHECK(filtered_read_buffer_.get());
   DCHECK_GT(filtered_read_buffer_len_, 0);
   DCHECK_LT(filtered_read_buffer_len_, 1000000);  // Sanity check.
-  DCHECK(!raw_read_buffer_);
+  DCHECK(!raw_read_buffer_.get());
 
   *bytes_read = 0;
-  Error error = ERR_FAILED;
+  bool rv = false;
 
   for (;;) {
     if (is_done())
-      return OK;
+      return true;
 
     if (!filter_needs_more_output_space_ && !filter_->stream_data_len()) {
       // We don't have any raw data to work with, so read from the transaction.
       int filtered_data_read;
-      error = ReadRawDataForFilter(&filtered_data_read);
-      // If ReadRawDataForFilter returned some data, fall through to the case
-      // below; otherwise, return early.
-      if (error != OK || filtered_data_read == 0)
-        return error;
-      filter_->FlushStreamBuffer(filtered_data_read);
+      if (ReadRawDataForFilter(&filtered_data_read)) {
+        if (filtered_data_read > 0) {
+          // Give data to filter.
+          filter_->FlushStreamBuffer(filtered_data_read);
+        } else {
+          return true;  // EOF.
+        }
+      } else {
+        return false;  // IO Pending (or error).
+      }
     }
 
     if ((filter_->stream_data_len() || filter_needs_more_output_space_) &&
@@ -737,7 +708,7 @@
           filter_needs_more_output_space_ = false;
           *bytes_read = filtered_data_len;
           postfilter_bytes_read_ += filtered_data_len;
-          error = OK;
+          rv = true;
           break;
         }
         case Filter::FILTER_NEED_MORE_DATA: {
@@ -750,7 +721,7 @@
           if (filtered_data_len > 0) {
             *bytes_read = filtered_data_len;
             postfilter_bytes_read_ += filtered_data_len;
-            error = OK;
+            rv = true;
           } else {
             // Read again since we haven't received enough data yet (e.g., we
             // may not have a complete gzip header yet).
@@ -761,7 +732,7 @@
         case Filter::FILTER_OK: {
           *bytes_read = filtered_data_len;
           postfilter_bytes_read_ += filtered_data_len;
-          error = OK;
+          rv = true;
           break;
         }
         case Filter::FILTER_ERROR: {
@@ -769,19 +740,21 @@
                    << "\"" << (request_ ? request_->url().spec() : "???")
                    << "\"" << " Filter Error";
           filter_needs_more_output_space_ = false;
-          error = ERR_CONTENT_DECODING_FAILED;
+          NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+                                      ERR_CONTENT_DECODING_FAILED));
+          rv = false;
           break;
         }
         default: {
           NOTREACHED();
           filter_needs_more_output_space_ = false;
-          error = ERR_FAILED;
+          rv = false;
           break;
         }
       }
 
       // If logging all bytes is enabled, log the filtered bytes read.
-      if (error == OK && request() && filtered_data_len > 0 &&
+      if (rv && request() && filtered_data_len > 0 &&
           request()->net_log().IsCapturing()) {
         request()->net_log().AddByteTransferEvent(
             NetLog::TYPE_URL_REQUEST_JOB_FILTERED_BYTES_READ, filtered_data_len,
@@ -789,18 +762,18 @@
       }
     } else {
       // we are done, or there is no data left.
-      error = OK;
+      rv = true;
     }
     break;
   }
 
-  if (error == OK) {
+  if (rv) {
     // When we successfully finished a read, we no longer need to save the
     // caller's buffers. Release our reference.
     filtered_read_buffer_ = NULL;
     filtered_read_buffer_len_ = 0;
   }
-  return error;
+  return rv;
 }
 
 void URLRequestJob::DestroyFilters() {
@@ -833,8 +806,9 @@
   request_->proxy_server_ = proxy_server;
 }
 
-Error URLRequestJob::ReadRawDataForFilter(int* bytes_read) {
-  Error error = ERR_FAILED;
+bool URLRequestJob::ReadRawDataForFilter(int* bytes_read) {
+  bool rv = false;
+
   DCHECK(bytes_read);
   DCHECK(filter_.get());
 
@@ -846,28 +820,30 @@
   if (!filter_->stream_data_len() && !is_done()) {
     IOBuffer* stream_buffer = filter_->stream_buffer();
     int stream_buffer_size = filter_->stream_buffer_size();
-    error = ReadRawDataHelper(stream_buffer, stream_buffer_size, bytes_read);
+    rv = ReadRawDataHelper(stream_buffer, stream_buffer_size, bytes_read);
   }
-  return error;
+  return rv;
 }
 
-Error URLRequestJob::ReadRawDataHelper(IOBuffer* buf,
-                                       int buf_size,
-                                       int* bytes_read) {
-  DCHECK(!raw_read_buffer_);
+bool URLRequestJob::ReadRawDataHelper(IOBuffer* buf,
+                                      int buf_size,
+                                      int* bytes_read) {
+  DCHECK(!request_->status().is_io_pending());
+  DCHECK(raw_read_buffer_.get() == NULL);
 
-  // Keep a pointer to the read buffer, so we have access to it in
-  // GatherRawReadStats() in the event that the read completes asynchronously.
+  // Keep a pointer to the read buffer, so we have access to it in the
+  // OnRawReadComplete() callback in the event that the read completes
+  // asynchronously.
   raw_read_buffer_ = buf;
-  Error error;
-  ConvertResultToError(ReadRawData(buf, buf_size), &error, bytes_read);
+  bool rv = ReadRawData(buf, buf_size, bytes_read);
 
-  if (error != ERR_IO_PENDING) {
-    // If the read completes synchronously, either success or failure, invoke
-    // GatherRawReadStats so we can account for the completed read.
-    GatherRawReadStats(error, *bytes_read);
+  if (!request_->status().is_io_pending()) {
+    // If the read completes synchronously, either success or failure,
+    // invoke the OnRawReadComplete callback so we can account for the
+    // completed read.
+    OnRawReadComplete(*bytes_read);
   }
-  return error;
+  return rv;
 }
 
 void URLRequestJob::FollowRedirect(const RedirectInfo& redirect_info) {
@@ -876,16 +852,9 @@
     NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
 }
 
-void URLRequestJob::GatherRawReadStats(Error error, int bytes_read) {
-  DCHECK(raw_read_buffer_ || bytes_read == 0);
-  DCHECK_NE(ERR_IO_PENDING, error);
-
-  if (error != OK) {
-    raw_read_buffer_ = nullptr;
-    return;
-  }
-  // If |filter_| is non-NULL, bytes will be logged after it is applied
-  // instead.
+void URLRequestJob::OnRawReadComplete(int bytes_read) {
+  DCHECK(raw_read_buffer_.get());
+  // If |filter_| is non-NULL, bytes will be logged after it is applied instead.
   if (!filter_.get() && request() && bytes_read > 0 &&
       request()->net_log().IsCapturing()) {
     request()->net_log().AddByteTransferEvent(
@@ -896,7 +865,7 @@
   if (bytes_read > 0) {
     RecordBytesRead(bytes_read);
   }
-  raw_read_buffer_ = nullptr;
+  raw_read_buffer_ = NULL;
 }
 
 void URLRequestJob::RecordBytesRead(int bytes_read) {
diff --git a/net/url_request/url_request_job.h b/net/url_request/url_request_job.h
index 002dc62..a81ea08 100644
--- a/net/url_request/url_request_job.h
+++ b/net/url_request/url_request_job.h
@@ -17,7 +17,6 @@
 #include "base/power_monitor/power_observer.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/load_states.h"
-#include "net/base/net_errors.h"
 #include "net/base/net_export.h"
 #include "net/base/request_priority.h"
 #include "net/base/upload_progress.h"
@@ -277,9 +276,23 @@
   // Notifies the job that headers have been received.
   void NotifyHeadersComplete();
 
+  // Notifies the request that the job has completed a Read operation.
+  void NotifyReadComplete(int bytes_read);
+
   // Notifies the request that a start error has occurred.
   void NotifyStartError(const URLRequestStatus& status);
 
+  // NotifyDone marks when we are done with a request.  It is really
+  // a glorified set_status, but also does internal state checking and
+  // job tracking.  It should be called once per request, when the job is
+  // finished doing all IO.
+  void NotifyDone(const URLRequestStatus& status);
+
+  // Some work performed by NotifyDone must be completed on a separate task
+  // so as to avoid re-entering the delegate.  This method exists to perform
+  // that work.
+  void CompleteNotifyDone();
+
   // Used as an asynchronous callback for Kill to notify the URLRequest
   // that we were canceled.
   void NotifyCanceled();
@@ -292,19 +305,17 @@
   void OnCallToDelegate();
   void OnCallToDelegateComplete();
 
-  // Called to read raw (pre-filtered) data from this Job. Reads at most
-  // |buf_size| bytes into |buf|.
-  // Possible return values:
-  //   >= 0: Read completed synchronously. Return value is the number of bytes
-  //         read. 0 means eof.
-  //   ERR_IO_PENDING: Read pending asynchronously.
-  //                   When the read completes, |ReadRawDataComplete| should be
-  //                   called.
-  //   Any other negative number: Read failed synchronously. Return value is a
-  //                   network error code.
-  // This method might hold onto a reference to |buf| (by incrementing the
-  // refcount) until the method completes or is cancelled.
-  virtual int ReadRawData(IOBuffer* buf, int buf_size);
+  // Called to read raw (pre-filtered) data from this Job.
+  // If returning true, data was read from the job.  buf will contain
+  // the data, and bytes_read will receive the number of bytes read.
+  // If returning true, and bytes_read is returned as 0, there is no
+  // additional data to be read.
+  // If returning false, an error occurred or an async IO is now pending.
+  // If async IO is pending, the status of the request will be
+  // URLRequestStatus::IO_PENDING, and buf must remain available until the
+  // operation is completed.  See comments on URLRequest::Read for more
+  // info.
+  virtual bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read);
 
   // Called to tell the job that a filter has successfully reached the end of
   // the stream.
@@ -315,14 +326,14 @@
   // bodies are never read.
   virtual void DoneReadingRedirectResponse();
 
-  // Reads filtered data from the request. Returns OK if immediately successful,
-  // ERR_IO_PENDING if the request couldn't complete synchronously, and some
-  // other error code if the request failed synchronously. Note that this
-  // function can issue new asynchronous requests if needed, in which case it
-  // returns ERR_IO_PENDING. If this method completes synchronously,
-  // |*bytes_read| is the number of bytes output by the filter chain if this
-  // method returns OK, or zero if this method returns an error.
-  Error ReadFilteredData(int* bytes_read);
+  // Informs the filter that data has been read into its buffer
+  void FilteredDataRead(int bytes_read);
+
+  // Reads filtered data from the request.  Returns true if successful,
+  // false otherwise.  Note, if there is not enough data received to
+  // return data, this call can issue a new async IO request under
+  // the hood.
+  bool ReadFilteredData(int* bytes_read);
 
   // Whether the response is being filtered in this job.
   // Only valid after NotifyHeadersComplete() has been called.
@@ -354,33 +365,19 @@
   // reflects bytes read even when there is no filter.
   int64 postfilter_bytes_read() const { return postfilter_bytes_read_; }
 
-  // Turns an integer result code into an Error and a count of bytes read.
-  // The semantics are:
-  //   |result| >= 0: |*error| == OK, |*count| == |result|
-  //   |result| < 0: |*error| = |result|, |*count| == 0
-  static void ConvertResultToError(int result, Error* error, int* count);
-
-  // Completion callback for raw reads. See |ReadRawData| for details.
-  // |bytes_read| is either >= 0 to indicate a successful read and count of
-  // bytes read, or < 0 to indicate an error.
-  void ReadRawDataComplete(int bytes_read);
-
   // The request that initiated this job. This value MAY BE NULL if the
   // request was released by DetachRequest().
   URLRequest* request_;
 
  private:
   // When data filtering is enabled, this function is used to read data
-  // for the filter. Returns a net error code to indicate if raw data was
-  // successfully read,  an error happened, or the IO is pending.
-  Error ReadRawDataForFilter(int* bytes_read);
-
-  // Informs the filter chain that data has been read into its buffer.
-  void PushInputToFilter(int bytes_read);
+  // for the filter.  Returns true if raw data was read.  Returns false if
+  // an error occurred (or we are waiting for IO to complete).
+  bool ReadRawDataForFilter(int* bytes_read);
 
   // Invokes ReadRawData and records bytes read if the read completes
   // synchronously.
-  Error ReadRawDataHelper(IOBuffer* buf, int buf_size, int* bytes_read);
+  bool ReadRawDataHelper(IOBuffer* buf, int buf_size, int* bytes_read);
 
   // Called in response to a redirect that was not canceled to follow the
   // redirect. The current job will be replaced with a new job loading the
@@ -389,9 +386,9 @@
 
   // Called after every raw read. If |bytes_read| is > 0, this indicates
   // a successful read of |bytes_read| unfiltered bytes. If |bytes_read|
-  // is 0, this indicates that there is no additional data to read. |error|
-  // specifies whether an error occurred and no bytes were read.
-  void GatherRawReadStats(Error error, int bytes_read);
+  // is 0, this indicates that there is no additional data to read. If
+  // |bytes_read| is < 0, an error occurred and no bytes were read.
+  void OnRawReadComplete(int bytes_read);
 
   // Updates the profiling info and notifies observers that an additional
   // |bytes_read| unfiltered bytes have been read for this job.
@@ -401,16 +398,6 @@
   // out.
   bool FilterHasData();
 
-  // NotifyDone marks that request is done. It is really a glorified
-  // set_status, but also does internal state checking and job tracking. It
-  // should be called once per request, when the job is finished doing all IO.
-  void NotifyDone(const URLRequestStatus& status);
-
-  // Some work performed by NotifyDone must be completed asynchronously so
-  // as to avoid re-entering URLRequest::Delegate. This method performs that
-  // work.
-  void CompleteNotifyDone();
-
   // Subclasses may implement this method to record packet arrival times.
   // The default implementation does nothing.  Only invoked when bytes have been
   // read since the last invocation.
diff --git a/net/url_request/url_request_simple_job.cc b/net/url_request/url_request_simple_job.cc
index c12555d4..bc15079 100644
--- a/net/url_request/url_request_simple_job.cc
+++ b/net/url_request/url_request_simple_job.cc
@@ -65,20 +65,33 @@
 
 URLRequestSimpleJob::~URLRequestSimpleJob() {}
 
-int URLRequestSimpleJob::ReadRawData(IOBuffer* buf, int buf_size) {
-  buf_size = std::min(static_cast<int64>(buf_size),
-                      byte_range_.last_byte_position() - next_data_offset_ + 1);
-  if (buf_size == 0)
-    return 0;
+bool URLRequestSimpleJob::ReadRawData(IOBuffer* buf,
+                                      int buf_size,
+                                      int* bytes_read) {
+  DCHECK(bytes_read);
+  buf_size = static_cast<int>(
+      std::min(static_cast<int64>(buf_size),
+               byte_range_.last_byte_position() - next_data_offset_ + 1));
+  DCHECK_GE(buf_size, 0);
+  if (buf_size == 0) {
+    *bytes_read = 0;
+    return true;
+  }
 
   // Do memory copy on a background thread. See crbug.com/422489.
   GetTaskRunner()->PostTaskAndReply(
       FROM_HERE, base::Bind(&CopyData, make_scoped_refptr(buf), buf_size, data_,
                             next_data_offset_),
-      base::Bind(&URLRequestSimpleJob::ReadRawDataComplete,
+      base::Bind(&URLRequestSimpleJob::OnReadCompleted,
                  weak_factory_.GetWeakPtr(), buf_size));
   next_data_offset_ += buf_size;
-  return ERR_IO_PENDING;
+  SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+  return false;
+}
+
+void URLRequestSimpleJob::OnReadCompleted(int bytes_read) {
+  SetStatus(URLRequestStatus());
+  NotifyReadComplete(bytes_read);
 }
 
 base::TaskRunner* URLRequestSimpleJob::GetTaskRunner() const {
@@ -109,8 +122,8 @@
     return;
 
   if (ranges().size() > 1) {
-    NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED,
-                                      ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+                                ERR_REQUEST_RANGE_NOT_SATISFIABLE));
     return;
   }
 
@@ -130,8 +143,8 @@
   if (result == OK) {
     // Notify that the headers are complete
     if (!byte_range_.ComputeBounds(data_->size())) {
-      NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED,
-                                        ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+      NotifyDone(URLRequestStatus(URLRequestStatus::FAILED,
+                                  ERR_REQUEST_RANGE_NOT_SATISFIABLE));
       return;
     }
 
diff --git a/net/url_request/url_request_simple_job.h b/net/url_request/url_request_simple_job.h
index 06f718e..6c9d5e8 100644
--- a/net/url_request/url_request_simple_job.h
+++ b/net/url_request/url_request_simple_job.h
@@ -28,7 +28,7 @@
 
   void Start() override;
   void Kill() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetMimeType(std::string* mime_type) const override;
   bool GetCharset(std::string* charset) override;
 
@@ -66,6 +66,7 @@
 
  private:
   void OnGetDataCompleted(int result);
+  void OnReadCompleted(int bytes_read);
 
   HttpByteRange byte_range_;
   std::string mime_type_;
diff --git a/net/url_request/url_request_status.cc b/net/url_request/url_request_status.cc
index 7207df2f..2a6a2fa 100644
--- a/net/url_request/url_request_status.cc
+++ b/net/url_request/url_request_status.cc
@@ -46,19 +46,4 @@
   }
 }
 
-Error URLRequestStatus::ToNetError() const {
-  switch (status_) {
-    case SUCCESS:
-      return OK;
-    case IO_PENDING:
-      return ERR_IO_PENDING;
-    case CANCELED:
-      return ERR_ABORTED;
-    case FAILED:
-      return static_cast<Error>(error_);
-  }
-  NOTREACHED();
-  return ERR_FAILED;
-}
-
 }  // namespace net
diff --git a/net/url_request/url_request_status.h b/net/url_request/url_request_status.h
index 694c5100..44a5d22b 100644
--- a/net/url_request/url_request_status.h
+++ b/net/url_request/url_request_status.h
@@ -5,7 +5,6 @@
 #ifndef NET_URL_REQUEST_URL_REQUEST_STATUS_H_
 #define NET_URL_REQUEST_URL_REQUEST_STATUS_H_
 
-#include "net/base/net_errors.h"
 #include "net/base/net_export.h"
 
 namespace net {
@@ -42,13 +41,6 @@
   // deprecated. See https://crbug.com/490311.
   static URLRequestStatus FromError(int error);
 
-  // Returns a Error corresponding to |status_|.
-  //   OK for OK
-  //   ERR_IO_PENDING for IO_PENDING
-  //   ERR_ABORTED for CANCELLED
-  //   Error for FAILED
-  Error ToNetError() const;
-
   Status status() const { return status_; }
   int error() const { return error_; }
 
diff --git a/net/url_request/url_request_test_job.cc b/net/url_request/url_request_test_job.cc
index bd1c9052..8a293c38 100644
--- a/net/url_request/url_request_test_job.cc
+++ b/net/url_request/url_request_test_job.cc
@@ -210,8 +210,7 @@
       // unexpected url, return error
       // FIXME(brettw) we may want to use WININET errors or have some more types
       // of errors
-      NotifyStartError(
-          URLRequestStatus(URLRequestStatus::FAILED, ERR_INVALID_URL));
+      NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, ERR_INVALID_URL));
       // FIXME(brettw): this should emulate a network error, and not just fail
       // initiating a connection
       return;
@@ -223,15 +222,22 @@
   this->NotifyHeadersComplete();
 }
 
-int URLRequestTestJob::ReadRawData(IOBuffer* buf, int buf_size) {
+bool URLRequestTestJob::ReadRawData(IOBuffer* buf,
+                                    int buf_size,
+                                    int* bytes_read) {
   if (stage_ == WAITING) {
     async_buf_ = buf;
     async_buf_size_ = buf_size;
-    return ERR_IO_PENDING;
+    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+    return false;
   }
 
-  if (offset_ >= static_cast<int>(response_data_.length()))
-    return 0;  // done reading
+  DCHECK(bytes_read);
+  *bytes_read = 0;
+
+  if (offset_ >= static_cast<int>(response_data_.length())) {
+    return true;  // done reading
+  }
 
   int to_read = buf_size;
   if (to_read + offset_ > static_cast<int>(response_data_.length()))
@@ -240,7 +246,8 @@
   memcpy(buf->data(), &response_data_.c_str()[offset_], to_read);
   offset_ += to_read;
 
-  return to_read;
+  *bytes_read = to_read;
+  return true;
 }
 
 void URLRequestTestJob::GetResponseInfo(HttpResponseInfo* info) {
@@ -298,15 +305,16 @@
       stage_ = DATA_AVAILABLE;
       // OK if ReadRawData wasn't called yet.
       if (async_buf_) {
-        int result = ReadRawData(async_buf_, async_buf_size_);
-        if (result < 0)
-          NOTREACHED() << "Reads should not fail in DATA_AVAILABLE.";
+        int bytes_read;
+        if (!ReadRawData(async_buf_, async_buf_size_, &bytes_read))
+          NOTREACHED() << "This should not return false in DATA_AVAILABLE.";
+        SetStatus(URLRequestStatus());  // clear the io pending flag
         if (NextReadAsync()) {
           // Make all future reads return io pending until the next
           // ProcessNextOperation().
           stage_ = WAITING;
         }
-        ReadRawDataComplete(result);
+        NotifyReadComplete(bytes_read);
       }
       break;
     case DATA_AVAILABLE:
diff --git a/net/url_request/url_request_test_job.h b/net/url_request/url_request_test_job.h
index eb1db01..09b31a4 100644
--- a/net/url_request/url_request_test_job.h
+++ b/net/url_request/url_request_test_job.h
@@ -111,7 +111,7 @@
   // Job functions
   void SetPriority(RequestPriority priority) override;
   void Start() override;
-  int ReadRawData(IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(IOBuffer* buf, int buf_size, int* bytes_read) override;
   void Kill() override;
   bool GetMimeType(std::string* mime_type) const override;
   void GetResponseInfo(HttpResponseInfo* info) override;
diff --git a/remoting/BUILD.gn b/remoting/BUILD.gn
index 7f71b22..613b68f 100644
--- a/remoting/BUILD.gn
+++ b/remoting/BUILD.gn
@@ -53,12 +53,16 @@
     deps += [
       "//remoting:remoting_perftests",
       "//remoting/host",
-      "//remoting/host:remoting_start_host",
-      "//remoting/host/it2me:remote_assistance_host",
 
-      #"//remoting:remoting_it2me_native_messaging_host",
-      #"//remoting:remoting_native_messaging_manifests",
+      "//remoting/host:remoting_native_messaging_manifests",
     ]
+
+    if (!is_chromeos) {
+      deps += [
+        "//remoting/host:remoting_start_host",
+        "//remoting/host/it2me:remote_assistance_host",
+      ]
+    }
   }
 
   if (enable_me2me_host) {
diff --git a/remoting/android/java/src/org/chromium/chromoting/Desktop.java b/remoting/android/java/src/org/chromium/chromoting/Desktop.java
index dc110f9..428636e0 100644
--- a/remoting/android/java/src/org/chromium/chromoting/Desktop.java
+++ b/remoting/android/java/src/org/chromium/chromoting/Desktop.java
@@ -14,14 +14,18 @@
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
+import android.support.v7.app.ActionBar.OnMenuVisibilityListener;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
+import android.view.View.OnTouchListener;
 import android.view.inputmethod.InputMethodManager;
 
 import org.chromium.chromoting.cardboard.DesktopActivity;
@@ -64,14 +68,17 @@
     /** Holds the scheduled task object which will be called to hide the ActionBar. */
     private Runnable mActionBarAutoHideTask;
 
+    /** The Toolbar instance backing our SupportActionBar. */
+    private Toolbar mToolbar;
+
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.desktop);
 
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
+        mToolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(mToolbar);
 
         mRemoteHostDesktop = (DesktopView) findViewById(R.id.desktop_view);
         mRemoteHostDesktop.setDesktop(this);
@@ -104,9 +111,22 @@
             // the experience for them.
             mActionBarAutoHideTask = new Runnable() {
                 public void run() {
-                    hideActionBar();
+                    if (!mToolbar.isOverflowMenuShowing()) {
+                        hideActionBar();
+                    }
                 }
             };
+
+            // Suspend the ActionBar timer when the user interacts with the options menu.
+            getSupportActionBar().addOnMenuVisibilityListener(new OnMenuVisibilityListener() {
+                public void onMenuVisibilityChanged(boolean isVisible) {
+                    if (isVisible) {
+                        stopActionBarAutoHideTimer();
+                    } else {
+                        startActionBarAutoHideTimer();
+                    }
+                }
+            });
         } else {
             mRemoteHostDesktop.setFitsSystemWindows(true);
         }
@@ -172,6 +192,28 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
             // We don't need to show a hide ActionBar button if immersive fullscreen is supported.
             menu.findItem(R.id.actionbar_hide).setVisible(false);
+
+            // Although the MenuItems are being created here, they do not have any backing Views yet
+            // as those are created just after this method exits.  We post an async task to the UI
+            // thread here so that we can attach our interaction listeners shortly after the views
+            // have been created.
+            final Menu menuFinal = menu;
+            new Handler().post(new Runnable() {
+                @Override
+                public void run() {
+                    // Attach a listener to the toolbar itself then attach one to each menu item
+                    // which has a backing view object.
+                    attachToolbarInteractionListenerToView(mToolbar);
+                    int items = menuFinal.size();
+                    for (int i = 0; i < items; i++) {
+                        int itemId = menuFinal.getItem(i).getItemId();
+                        View menuItemView = findViewById(itemId);
+                        if (menuItemView != null) {
+                            attachToolbarInteractionListenerToView(menuItemView);
+                        }
+                    }
+                }
+            });
         }
 
         // TODO(joedow): Remove this line when touch input mode has been implemented.
@@ -182,6 +224,33 @@
         return super.onCreateOptionsMenu(menu);
     }
 
+    // Any time an onTouchListener is attached, a lint warning about filtering touch events is
+    // generated.  Since the function below is only used to listen to, not intercept, the events,
+    // the lint warning can be safely suppressed.
+    @SuppressLint("ClickableViewAccessibility")
+    private void attachToolbarInteractionListenerToView(View view) {
+        view.setOnTouchListener(new OnTouchListener() {
+            @Override
+            public boolean onTouch(View view, MotionEvent event) {
+                switch (event.getAction()) {
+                    case MotionEvent.ACTION_DOWN:
+                        stopActionBarAutoHideTimer();
+                        break;
+
+                    case MotionEvent.ACTION_UP:
+                        startActionBarAutoHideTimer();
+                        break;
+
+                    default:
+                        // Ignore.
+                        break;
+                }
+
+                return false;
+            }
+        });
+    }
+
     // Posts a deplayed task to hide the ActionBar.  If an existing task has already been scheduled,
     // then the previous task is removed and the new one scheduled, effectively resetting the timer.
     private void startActionBarAutoHideTimer() {
@@ -307,9 +376,6 @@
 
         mActivityLifecycleListener.onActivityOptionsItemSelected(this, item);
 
-        // Whenever a user selects an option from the ActionBar, reset the auto-hide timer.
-        startActionBarAutoHideTimer();
-
         if (id == R.id.actionbar_cardboard) {
             onCardboardItemSelected();
             return true;
diff --git a/remoting/client/plugin/BUILD.gn b/remoting/client/plugin/BUILD.gn
index 9f3d8ceb..01432fd 100644
--- a/remoting/client/plugin/BUILD.gn
+++ b/remoting/client/plugin/BUILD.gn
@@ -5,6 +5,7 @@
 assert(is_nacl,
        "These targets must only be built using the untrusted NaCl toolchains.")
 
+import("//build/config/features.gni")
 import("//remoting/remoting_srcs.gni")
 
 config("enable_linker_optimization") {
@@ -40,3 +41,17 @@
 
   include_dirs = [ "//ppapi/lib/gl/include" ]
 }
+
+if (enable_pnacl && is_debug) {
+  copy("remoting_client_plugin_newlib_debug") {
+    public_deps = [
+      ":remoting_client_plugin_newlib",
+    ]
+    sources = [
+      "$root_out_dir/exe.unstripped/remoting_client_plugin_newlib.pexe",
+    ]
+    outputs = [
+      "$root_out_dir/remoting_client_plugin_newlib.pexe.debug",
+    ]
+  }
+}
diff --git a/remoting/host/cast_extension_session.cc b/remoting/host/cast_extension_session.cc
index 9dce746f..5b7e9a6 100644
--- a/remoting/host/cast_extension_session.cc
+++ b/remoting/host/cast_extension_session.cc
@@ -11,9 +11,9 @@
 #include "base/synchronization/waitable_event.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "remoting/host/cast_video_capturer_adapter.h"
-#include "remoting/host/chromium_port_allocator_factory.h"
 #include "remoting/host/client_session.h"
 #include "remoting/proto/control.pb.h"
+#include "remoting/protocol/chromium_port_allocator_factory.h"
 #include "remoting/protocol/client_stub.h"
 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
 #include "third_party/libjingle/source/talk/app/webrtc/test/fakeconstraints.h"
@@ -498,7 +498,7 @@
                            webrtc::MediaConstraintsInterface::kValueTrue);
 
   rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface>
-      port_allocator_factory = ChromiumPortAllocatorFactory::Create(
+      port_allocator_factory = protocol::ChromiumPortAllocatorFactory::Create(
           network_settings_, url_request_context_getter_);
 
   peer_connection_ = peer_conn_factory_->CreatePeerConnection(
diff --git a/remoting/protocol/BUILD.gn b/remoting/protocol/BUILD.gn
index 722bd7716..f5d79ca 100644
--- a/remoting/protocol/BUILD.gn
+++ b/remoting/protocol/BUILD.gn
@@ -32,6 +32,7 @@
   if (is_nacl) {
     sources -= [
       "chromium_port_allocator.cc",
+      "chromium_port_allocator_factory.cc",
       "chromium_socket_factory.cc",
     ]
   }
diff --git a/remoting/host/chromium_port_allocator_factory.cc b/remoting/protocol/chromium_port_allocator_factory.cc
similarity index 73%
rename from remoting/host/chromium_port_allocator_factory.cc
rename to remoting/protocol/chromium_port_allocator_factory.cc
index 377c48b..b262611 100644
--- a/remoting/host/chromium_port_allocator_factory.cc
+++ b/remoting/protocol/chromium_port_allocator_factory.cc
@@ -1,8 +1,8 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "remoting/host/chromium_port_allocator_factory.h"
+#include "remoting/protocol/chromium_port_allocator_factory.h"
 
 #include "base/logging.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -10,19 +10,19 @@
 #include "remoting/protocol/network_settings.h"
 
 namespace remoting {
+namespace protocol {
 
 ChromiumPortAllocatorFactory::ChromiumPortAllocatorFactory(
-    const protocol::NetworkSettings& network_settings,
+    const NetworkSettings& network_settings,
     scoped_refptr<net::URLRequestContextGetter> url_request_context_getter)
     : network_settings_(network_settings),
-      url_request_context_getter_(url_request_context_getter) {
-}
+      url_request_context_getter_(url_request_context_getter) {}
 
 ChromiumPortAllocatorFactory::~ChromiumPortAllocatorFactory() {}
 
 rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface>
 ChromiumPortAllocatorFactory::Create(
-    const protocol::NetworkSettings& network_settings,
+    const NetworkSettings& network_settings,
     scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) {
   rtc::RefCountedObject<ChromiumPortAllocatorFactory>* allocator_factory =
       new rtc::RefCountedObject<ChromiumPortAllocatorFactory>(
@@ -33,13 +33,12 @@
 cricket::PortAllocator* ChromiumPortAllocatorFactory::CreatePortAllocator(
     const std::vector<StunConfiguration>& stun_servers,
     const std::vector<TurnConfiguration>& turn_configurations) {
-  scoped_ptr<protocol::ChromiumPortAllocator> port_allocator(
-      protocol::ChromiumPortAllocator::Create(url_request_context_getter_,
+  scoped_ptr<ChromiumPortAllocator> port_allocator(
+      ChromiumPortAllocator::Create(url_request_context_getter_,
                                     network_settings_));
 
   std::vector<rtc::SocketAddress> stun_hosts;
-  typedef std::vector<StunConfiguration>::const_iterator StunIt;
-  for (StunIt stun_it = stun_servers.begin(); stun_it != stun_servers.end();
+  for (auto stun_it = stun_servers.begin(); stun_it != stun_servers.end();
        ++stun_it) {
     stun_hosts.push_back(stun_it->server);
   }
@@ -51,5 +50,6 @@
   return port_allocator.release();
 }
 
+}  // namespace protocol
 }  // namespace remoting
 
diff --git a/remoting/host/chromium_port_allocator_factory.h b/remoting/protocol/chromium_port_allocator_factory.h
similarity index 72%
rename from remoting/host/chromium_port_allocator_factory.h
rename to remoting/protocol/chromium_port_allocator_factory.h
index 85b58d27..bbfa1b7 100644
--- a/remoting/host/chromium_port_allocator_factory.h
+++ b/remoting/protocol/chromium_port_allocator_factory.h
@@ -1,11 +1,13 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef REMOTING_HOST_CHROMIUM_PORT_ALLOCATOR_FACTORY_H_
-#define REMOTING_HOST_CHROMIUM_PORT_ALLOCATOR_FACTORY_H_
+#ifndef REMOTING_PROTOCOL_CHROMIUM_PORT_ALLOCATOR_FACTORY_H_
+#define REMOTING_PROTOCOL_CHROMIUM_PORT_ALLOCATOR_FACTORY_H_
 
+#include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "remoting/protocol/network_settings.h"
 #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
 
 namespace net {
@@ -13,16 +15,13 @@
 }  // namespace net
 
 namespace remoting {
-
 namespace protocol {
-struct NetworkSettings;
-}  // namespace protocol
 
 class ChromiumPortAllocatorFactory
     : public webrtc::PortAllocatorFactoryInterface {
  public:
   static rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> Create(
-      const protocol::NetworkSettings& network_settings,
+      const NetworkSettings& network_settings,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter);
 
   // webrtc::PortAllocatorFactoryInterface implementation.
@@ -32,18 +31,19 @@
 
  protected:
   ChromiumPortAllocatorFactory(
-      const protocol::NetworkSettings& network_settings,
+      const NetworkSettings& network_settings,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter);
   ~ChromiumPortAllocatorFactory() override;
 
  private:
-  const protocol::NetworkSettings& network_settings_;
+  NetworkSettings network_settings_;
   scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromiumPortAllocatorFactory);
 };
 
+}  // namespace protocol
 }  // namespace remoting
 
-#endif  // REMOTING_HOST_CHROMIUM_PORT_ALLOCATOR_FACTORY_H_
+#endif  // REMOTING_PROTOCOL_CHROMIUM_PORT_ALLOCATOR_FACTORY_H_
 
diff --git a/remoting/remoting_host_srcs.gypi b/remoting/remoting_host_srcs.gypi
index 306c070f..3daadc7 100644
--- a/remoting/remoting_host_srcs.gypi
+++ b/remoting/remoting_host_srcs.gypi
@@ -36,8 +36,6 @@
       'host/chromeos/point_transformer.h',
       'host/chromeos/skia_bitmap_desktop_frame.cc',
       'host/chromeos/skia_bitmap_desktop_frame.h',
-      'host/chromium_port_allocator_factory.cc',
-      'host/chromium_port_allocator_factory.h',
       'host/chromoting_host.cc',
       'host/chromoting_host.h',
       'host/chromoting_host_context.cc',
diff --git a/remoting/remoting_nacl.gyp b/remoting/remoting_nacl.gyp
index 426eb638..d5cb7be 100644
--- a/remoting/remoting_nacl.gyp
+++ b/remoting/remoting_nacl.gyp
@@ -124,6 +124,7 @@
       'sources!': [
         'base/url_request_context_getter.cc',
         'protocol/chromium_socket_factory.cc',
+        'protocol/chromium_port_allocator_factory.cc',
       ],
 
       # Include normalizing_input_filter_*.cc excluded by the filename
diff --git a/remoting/remoting_srcs.gypi b/remoting/remoting_srcs.gypi
index aa41729..04d3738 100644
--- a/remoting/remoting_srcs.gypi
+++ b/remoting/remoting_srcs.gypi
@@ -88,6 +88,8 @@
       'protocol/channel_socket_adapter.h',
       'protocol/chromium_port_allocator.cc',
       'protocol/chromium_port_allocator.h',
+      'protocol/chromium_port_allocator_factory.cc',
+      'protocol/chromium_port_allocator_factory.h',
       'protocol/chromium_socket_factory.cc',
       'protocol/chromium_socket_factory.h',
       'protocol/client_control_dispatcher.cc',
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb
index 068eab2..7d9a7382 100644
--- a/remoting/resources/remoting_strings_am.xtb
+++ b/remoting/resources/remoting_strings_am.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">ይግቡ</translation>
 <translation id="3989511127559254552">ለመቀጠል በመጀመሪያ ለኮሚውተርዎ ተጨማሪ የመዳረሻ ፍቃዶችን መስጠት አለብዎት። ይህንን አንድ ጊዜ ብቻ ነው ማድረግ የሚኖርብዎት።</translation>
 <translation id="4006787130661126000">Chrome የርቀት ዴስክቶፕን ተጠቅመው ይህንን ኮምፒውተር መድረስ ከፈለጉ የርቀት ግንኙነቶችን ማንቃት አለብዎት።</translation>
+<translation id="405887016757208221">የርቀት ኮምፒውተሩ ክፍለጊዜውን ለመጀመር ተስኖታል። ችግሩ ከቀጠለ እባክዎን አስተናጋጁን በድጋሚ ለማዋቀር ይሞክሩ።</translation>
 <translation id="4068946408131579958">ሁሉም ግንኙነቶች</translation>
 <translation id="409800995205263688">ማሳሰቢያ፦ የመምሪያ ቅንብሮች በአውታረ መረብዎ ውስጥ ባሉ ኮምፒውተሮች የሚኖሩ ግንኙነቶችን ብቻ ነው የሚፈቅዱት።</translation>
 <translation id="4155497795971509630">አንዳንድ የሚያስፈልጉ ክፍሎች ይጎድላሉ። እባክዎ የሶፍትዌሩ የቅርብ ጊዜውን ስሪት መጫንዎን ያረጋግጡና እንደገና ይሞክሩ።</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">ይህን መተግበሪያ ለማሄድ ፍቃድ የለዎትም።</translation>
 <translation id="7948001860594368197">የማያ ገጽ አማራጮች</translation>
 <translation id="7970576581263377361">ማረጋገጥ አልተሳካም። እባክዎ እንደገና ወደ Chromium ይግቡ።</translation>
+<translation id="7981525049612125370">የርቀት ክፍለጊዜውን ጊዜው አልፎበታል።</translation>
 <translation id="8041721485428375115">የChrome የርቀት ዴስክቶፕ አስተናጋጅ ጫኚውን በማውረድዎ በGoogle <ph name="LINK_BEGIN" />የአገልግሎት ውል<ph name="LINK_END" />ይስማማሉ።</translation>
 <translation id="8073845705237259513">Chrome የርቀት ዴስክቶፕን ለመጠቀም የአንድ የGoogle መለያ በመሣሪያዎ ላይ ማከል አለብዎት።</translation>
 <translation id="80739703311984697">የርቀት አስተናጋጁ ለሶስተኛ ወገን ድር ጣቢያ እንዲያረጋግጡ ይፈልጋል። ለመቀጠል Chromoting ይህን አድራሻ እንዲደርስበት ተጨማሪ ፍቃዶችን መስጠት አለብዎት፦</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index a9f517f..caa0a218 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">تسجيل الدخول</translation>
 <translation id="3989511127559254552">للاستمرار، يجب أولاً منح أذونات موسّعة بالدخول إلى جهاز الكمبيوتر. لن يُطلب منك إجراء ذلك سوى مرة واحدة.</translation>
 <translation id="4006787130661126000">‏يجب تمكين الاتصالات عن بُعد إذا كنت تريد استخدام سطح المكتب البعيد من Chrome للدخول إلى هذا الكمبيوتر.</translation>
+<translation id="405887016757208221">قد فشل الكمبيوتر البعيد في تهيئة الجلسة. وإذا استمرت المشكلة، يُرجى محاولة تهيئة المضيف مرة أخرى.</translation>
 <translation id="4068946408131579958">جميع الاتصالات</translation>
 <translation id="409800995205263688">ملاحظة: لا تسمح إعدادات السياسة سوى بالاتصال بين أجهزة الكمبيوتر داخل شبكتك.</translation>
 <translation id="4155497795971509630">بعض المكونات المطلوبة مفقودة. الرجاء التأكد من تثبيت أحدث إصدار من البرنامج وإعادة المحاولة.</translation>
@@ -259,6 +260,7 @@
 <translation id="7869445566579231750">ليس لديك إذن لتشغيل هذا التطبيق.</translation>
 <translation id="7948001860594368197">خيارات الشاشة</translation>
 <translation id="7970576581263377361">‏أخفقت المصادقة.يُرجى تسجيل الدخول إلى Chromium مرة أخرى.</translation>
+<translation id="7981525049612125370">انتهت صلاحية الجلسة البعيدة.</translation>
 <translation id="8041721485428375115">‏من خلال تنزيل أداة تثبيت مضيف سطح المكتب البعيد من Chrome، توافق على <ph name="LINK_BEGIN" />بنود خدمة<ph name="LINK_END" /> Google.</translation>
 <translation id="8073845705237259513">‏لاستخدام سطح المكتب البعيد من Chrome، يجب إضافة حساب في Google إلى جهازك.</translation>
 <translation id="80739703311984697">‏يتطلب منك المضيف البعيد مصادقة موقع ويب لجهة خارجية. للمتابعة، يجب منح عملية التوافق مع نظام التشغيل Chrome أذونات إضافية للدخول إلى هذا العنوان:</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb
index 5286dd8..829639b 100644
--- a/remoting/resources/remoting_strings_el.xtb
+++ b/remoting/resources/remoting_strings_el.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Σύνδεση</translation>
 <translation id="3989511127559254552">Για να συνεχίσετε θα πρέπει πρώτα να παραχωρήσετε εκτεταμένα δικαιώματα πρόσβασης στον υπολογιστή σας. Αυτό πρέπει να γίνει μόνο μία φορά.</translation>
 <translation id="4006787130661126000">Θα πρέπει να ενεργοποιήσετε τις απομακρυσμένες συνδέσεις εάν επιθυμείτε να χρησιμοποιήσετε την Απομακρυσμένη επιφάνεια εργασίας Chrome για πρόσβαση σε αυτόν τον υπολογιστή.</translation>
+<translation id="405887016757208221">Ο απομακρυσμένος υπολογιστής απέτυχε να προετοιμάσει την περίοδο σύνδεσης. Αν το πρόβλημα δεν επιλυθεί, προσπαθήστε να διαμορφώσετε τον κεντρικό υπολογιστή ξανά.</translation>
 <translation id="4068946408131579958">Όλες οι συνδέσεις</translation>
 <translation id="409800995205263688">ΣΗΜΕΙΩΣΗ: Οι ρυθμίσεις πολιτικής επιτρέπουν συνδέσεις μόνο μεταξύ υπολογιστών που ανήκουν  στο δίκτυό σας.</translation>
 <translation id="4155497795971509630">Λείπουν ορισμένα απαιτούμενα στοιχεία. Βεβαιωθείτε ότι έχετε εγκαταστήσει την πιο πρόσφατη έκδοση του λογισμικού και δοκιμάστε ξανά.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">Δεν έχετε δικαίωμα εκτέλεσης αυτής της εφαρμογής.</translation>
 <translation id="7948001860594368197">Επιλογές οθόνης</translation>
 <translation id="7970576581263377361">Ο έλεγχος ταυτότητας απέτυχε. Συνδεθείτε ξανά στο Chromium.</translation>
+<translation id="7981525049612125370">Η απομακρυσμένη περίοδος σύνδεσης έχει λήξει.</translation>
 <translation id="8041721485428375115">Με τη λήψη του προγράμματος εγκατάστασης κεντρικού υπολογιστή Απομακρυσμένης επιφάνειας εργασίας Chrome, αποδέχεστε τους <ph name="LINK_BEGIN" />Όρους Παροχής Υπηρεσιών<ph name="LINK_END" /> της Google.</translation>
 <translation id="8073845705237259513">Για να χρησιμοποιήσετε την Απομακρυσμένη επιφάνεια εργασίας Chrome, θα πρέπει να προσθέσετε έναν Λογαριασμό Google στη συσκευή σας.</translation>
 <translation id="80739703311984697">Ο απομακρυσμένος κεντρικός υπολογιστής ζήτησε τον έλεγχο της ταυτότητάς σας στον ιστότοπο ενός τρίτου μέρους. Για να συνεχίσετε, θα πρέπει να παραχωρήσετε στο Chromoting επιπλέον άδειες για πρόσβαση σε αυτήν τη διεύθυνση:</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb
index dcc61e00..4d3894e 100644
--- a/remoting/resources/remoting_strings_en-GB.xtb
+++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Sign in</translation>
 <translation id="3989511127559254552">To continue, you must first grant extended access permissions to your computer. You only have to do this once.</translation>
 <translation id="4006787130661126000">You must enable remote connections if you want to use Chrome Remote Desktop to access this computer.</translation>
+<translation id="405887016757208221">The remote computer has failed to initialise the session. If problem persists please try to configure the host again.</translation>
 <translation id="4068946408131579958">All connections</translation>
 <translation id="409800995205263688">NOTE: Policy settings permit connections only between computers within your network.</translation>
 <translation id="4155497795971509630">Some required components are missing. Please make sure that you have installed the latest version of the software and try again.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">You do not have permission to run this application.</translation>
 <translation id="7948001860594368197">Screen options</translation>
 <translation id="7970576581263377361">Authentication failed. Please sign in to Chromium again.</translation>
+<translation id="7981525049612125370">The remote session has expired.</translation>
 <translation id="8041721485428375115">By downloading the Chrome Remote Desktop Host Installer, you are agreeing to the Google <ph name="LINK_BEGIN" />Terms of Service<ph name="LINK_END" />.</translation>
 <translation id="8073845705237259513">To use Chrome Remote Desktop, you'll need to add a Google Account to your device.</translation>
 <translation id="80739703311984697">The remote host requires you to authenticate to a third-party website. To continue, you must grant Chromoting additional permissions to access this address:</translation>
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb
index 8865920..3f14849 100644
--- a/remoting/resources/remoting_strings_fil.xtb
+++ b/remoting/resources/remoting_strings_fil.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Mag-sign in</translation>
 <translation id="3989511127559254552">Upang magpatuloy, dapat ka munang magbigay ng mga pahintulot sa pinalawak na access sa iyong computer. Isang beses mo lang ito kailangang gawin.</translation>
 <translation id="4006787130661126000">Dapat mong paganahin ang mga malayuang koneksyon kung nais mong gamitin ang Remote na Desktop ng Chrome upang i-access ang computer na ito.</translation>
+<translation id="405887016757208221">Hindi nasimulan ng remote na computer ang session. Kung ayaw mawala ng problema, pakisubukang i-configure muli ang host.</translation>
 <translation id="4068946408131579958">Lahat ng koneksyon</translation>
 <translation id="409800995205263688">TANDAAN: Ang pinapayagan ng mga setting ng patakaran ay mga koneksyon lang sa pagitan ng mga computer sa loob ng iyong network.</translation>
 <translation id="4155497795971509630">Nawawala ang ilang bahagi na kinakailangan. Pakitiyak na na-install mo ang pinakabagong bersyon ng software at subukang muli.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">Wala kang pahintulot na gamitin ang application na ito.</translation>
 <translation id="7948001860594368197">Mga pagpipilian sa screen</translation>
 <translation id="7970576581263377361">Hindi naisagawa ang pagpapatotoo. Mangyaring muling mag-sign in sa Chromium.</translation>
+<translation id="7981525049612125370">Nag-expire na ang remote na session.</translation>
 <translation id="8041721485428375115">Sa pamamagitan ng pagda-download ng Host Installer ng Remote na Desktop ng Chrome, sumasang-ayon ka sa <ph name="LINK_BEGIN" />Mga Tuntunin ng Serbisyo<ph name="LINK_END" /> ng Google.</translation>
 <translation id="8073845705237259513">Upang magamit ang Chrome Remote Desktop, kakailanganin mong magdagdag ng Google Account sa iyong device.</translation>
 <translation id="80739703311984697">Hinihiling sa iyo ng remote host na magpatunay sa isang website ng third-party. Upang makapagpatuloy, dapat mong bigyan ng mga karagdagang pahintulot ang Chromoting upang ma-access ang address na ito:</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb
index 1beb0aa..9696934 100644
--- a/remoting/resources/remoting_strings_id.xtb
+++ b/remoting/resources/remoting_strings_id.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Masuk</translation>
 <translation id="3989511127559254552">Untuk melanjutkan, Anda harus memberikan izin akses yang diperpanjang ke komputer. Anda hanya perlu melakukan ini satu kali.</translation>
 <translation id="4006787130661126000">Anda harus mengaktifkan sambungan jarak jauh jika ingin menggunakan Chrome Desktop Jarak Jauh untuk mengakses komputer ini.</translation>
+<translation id="405887016757208221">Komputer jarak jauh gagal melakukan inisialisasi sesi. Jika masalah tetap ada, coba lakukan konfigurasi pada host lagi.</translation>
 <translation id="4068946408131579958">Semua sambungan</translation>
 <translation id="409800995205263688">CATATAN: Setelan kebijakan hanya mengizinkan sambungan antar-komputer dalam jaringan Anda.</translation>
 <translation id="4155497795971509630">Beberapa komponen yang diperlukan tidak ada. Pastikan Anda memasang perangkat lunak versi terbaru dan coba lagi.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">Anda tidak memiliki izin untuk menjalankan aplikasi ini.</translation>
 <translation id="7948001860594368197">Opsi layar</translation>
 <translation id="7970576581263377361">Autentikasi gagal. Masuk ke Chromium lagi.</translation>
+<translation id="7981525049612125370">Sesi jarak jauh telah berakhir.</translation>
 <translation id="8041721485428375115">Dengan mengunduh Pemasang Host Chrome Desktop Jarak Jauh, Anda menyetujui <ph name="LINK_BEGIN" />Persyaratan Layanan<ph name="LINK_END" /> Google.</translation>
 <translation id="8073845705237259513">Untuk menggunakan Chrome Desktop Jarak Jauh, Anda perlu menambahkan Akun Google ke perangkat.</translation>
 <translation id="80739703311984697">Hosting jarak jauh mewajibkan Anda mengautentikasi ke situs web pihak ketiga. Untuk melanjutkan, Anda harus memberikan izin tambahan ke Chromoting untuk mengakses alamat ini:</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb
index fed1036..019541b5 100644
--- a/remoting/resources/remoting_strings_iw.xtb
+++ b/remoting/resources/remoting_strings_iw.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">כניסה</translation>
 <translation id="3989511127559254552">כדי להמשיך, ראשית עליך להעניק הרשאות גישה מורחבות למחשב שלך. עליך לעשות זאת פעם אחת בלבד.</translation>
 <translation id="4006787130661126000">‏אם ברצונך להשתמש ב'שולחן עבודה מרוחק של Chrome' כדי לגשת למחשב זה, עליך להפעיל חיבורים מרוחקים.</translation>
+<translation id="405887016757208221">המחשב המרוחק לא הצליח לאתחל את ההפעלה. אם הבעיה נמשכת, נסה להגדיר שוב את המארח.</translation>
 <translation id="4068946408131579958">כל החיבורים</translation>
 <translation id="409800995205263688">הערה: הגדרות המדיניות מתירות חיבורים רק בין מחשבים הנמצאים בתוך הרשת שלך.</translation>
 <translation id="4155497795971509630">חלק מהרכיבים הדרושים חסרים. ודא שהתקנת את הגרסה העדכנית ביותר של התוכנה ונסה שוב.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">אין לך הרשאה להריץ את היישום הזה.</translation>
 <translation id="7948001860594368197">אפשרויות מסך</translation>
 <translation id="7970576581263377361">‏האימות נכשל. היכנס שוב ל-Chromium.</translation>
+<translation id="7981525049612125370">פג התוקף של ההפעלה המרוחקת.</translation>
 <translation id="8041721485428375115">‏בהורדת מנהל ההתקנה של מארח שולחן העבודה המרוחק של Chrome, אתה מביע הסכמה ל<ph name="LINK_BEGIN" />תנאים ולהגבלות<ph name="LINK_END" /> של Google.</translation>
 <translation id="8073845705237259513">‏כדי להשתמש ב'שולחן עבודה מרוחק של Chrome', עליך להוסיף חשבון Google למכשיר שלך.</translation>
 <translation id="80739703311984697">‏המארח המרוחק דורש שתבצע אימות מול אתר של צד שלישי. כדי להמשיך, עליך להעניק ל-Chromoting הרשאות נוספות כדי לגשת לכתובת זו:</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb
index f629290..4a6236f 100644
--- a/remoting/resources/remoting_strings_ms.xtb
+++ b/remoting/resources/remoting_strings_ms.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Log masuk</translation>
 <translation id="3989511127559254552">Untuk meneruskan, anda mesti memberikan kebenaran akses lanjutan terlebih dahulu kepada komputer anda. Anda hanya perlu melakukannya sekali.</translation>
 <translation id="4006787130661126000">Anda mesti mendayakan sambungan jauh jika anda mahu menggunakan Desktop Jauh Chrome untuk mengakses komputer ini.</translation>
+<translation id="405887016757208221">Komputer jauh gagal memulakan sesi. Jika masalah berterusan, sila cuba mengkonfigurasi hos sekali lagi.</translation>
 <translation id="4068946408131579958">Semua sambungan</translation>
 <translation id="409800995205263688">NOTA: Tetapan dasar membenarkan sambungan antara komputer dalam rangkaian anda sahaja.</translation>
 <translation id="4155497795971509630">Sesetengah komponen yang diperlukan hilang. Sila pastikan anda telah memasang versi terkini perisian dan cuba lagi.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">Anda tidak mempunyai kebenaran untuk menjalankan aplikasi ini.</translation>
 <translation id="7948001860594368197">Pilihan skrin</translation>
 <translation id="7970576581263377361">Pengesahan gagal. Sila log masuk ke Chromium sekali lagi.</translation>
+<translation id="7981525049612125370">Sesi jauh telah tamat tempoh.</translation>
 <translation id="8041721485428375115">Apabila memuat turun Pemasang Hos Desktop Jauh Chrome, anda bersetuju menerima <ph name="LINK_BEGIN" />Syarat Perkhidmatan<ph name="LINK_END" /> Google.</translation>
 <translation id="8073845705237259513">Untuk menggunakan Desktop Jauh Chrome, anda perlu menambahkan Akaun Google kepada peranti anda.</translation>
 <translation id="80739703311984697">Hos jauh memerlukan anda membuat pengesahan pada tapak web pihak ketiga. Untuk meneruskan, anda hendaklah memberikan Chromoting kebenaran tambahan untuk mengakses alamat ini:</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb
index 8f557eb..e81d95a 100644
--- a/remoting/resources/remoting_strings_sk.xtb
+++ b/remoting/resources/remoting_strings_sk.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Prihlásiť sa</translation>
 <translation id="3989511127559254552">Ak chcete pokračovať, musíte najprv udeliť rozšírené povolenia na prístup k vášmu počítaču. Stačí to urobiť len raz.</translation>
 <translation id="4006787130661126000">Ak chcete na prístup k tomuto počítaču použiť Vzdialenú plochu Chrome, musíte povoliť vzdialené pripojenia.</translation>
+<translation id="405887016757208221">Inicializácia relácie vzdialeným počítačom sa nepodarila. Ak problém pretrváva, skúste opätovne nakonfigurovať hostiteľa.</translation>
 <translation id="4068946408131579958">Všetky pripojenia</translation>
 <translation id="409800995205263688">Poznámka: Nastavenia pravidiel umožňujú pripojenie len medzi počítačmi v rámci vašej siete.</translation>
 <translation id="4155497795971509630">Niektoré potrebné komponenty chýbajú. Uistite sa, že máte nainštalovanú najnovšiu verziu príslušného softvéru a skúste to znova.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">Nemáte povolenie spustiť túto aplikáciu.</translation>
 <translation id="7948001860594368197">Možnosti obrazovky</translation>
 <translation id="7970576581263377361">Overenie zlyhalo. Prihláste sa do prehliadača Chromium a skúste to znova.</translation>
+<translation id="7981525049612125370">Vzdialená relácia vypršala.</translation>
 <translation id="8041721485428375115">Stiahnutím nástroja na inštaláciu hostiteľa Vzdialenej plochy Chrome vyjadrujete súhlas so <ph name="LINK_BEGIN" />zmluvnými podmienkami<ph name="LINK_END" /> Google.</translation>
 <translation id="8073845705237259513">Ak chcete používať aplikáciu Vzdialená plocha Chrome, musíte si na zariadení pridať účet Google.</translation>
 <translation id="80739703311984697">Vzdialený hostiteľ od vás vyžaduje overenie na webových stránkach tretej strany. Ak chcete pokračovať, musíte funkcii Chromoting udeliť dodatočné oprávnenie na prístup k tejto adrese:</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb
index 362bdfe..d548ce2 100644
--- a/remoting/resources/remoting_strings_sv.xtb
+++ b/remoting/resources/remoting_strings_sv.xtb
@@ -124,6 +124,7 @@
 <translation id="3950820424414687140">Logga in</translation>
 <translation id="3989511127559254552">Innan du kan fortsätta måste du bevilja utökad åtkomstbehörighet till datorn. Du behöver bara göra det en gång.</translation>
 <translation id="4006787130661126000">Du måste aktivera fjärranslutningar om du vill använda Chrome Remote Desktop för att få åtkomst till den här datorn.</translation>
+<translation id="405887016757208221">Fjärrdatorn har misslyckats med att starta sessionen. Konfigurera värden på nytt om problemet kvarstår.</translation>
 <translation id="4068946408131579958">Alla anslutningar</translation>
 <translation id="409800995205263688">OBS! Enligt policyinställningarna tillåts endast anslutning mellan datorer i ditt nätverk.</translation>
 <translation id="4155497795971509630">Vissa obligatoriska komponenter saknas. Kontrollera att du har installerat den senaste versionen av programvaran och försök igen.</translation>
@@ -258,6 +259,7 @@
 <translation id="7869445566579231750">Du har inte behörighet att köra den här appen.</translation>
 <translation id="7948001860594368197">Skärmalternativ</translation>
 <translation id="7970576581263377361">Autentiseringen misslyckades. Logga in i Chromium igen.</translation>
+<translation id="7981525049612125370">Fjärrsessionen har avslutats.</translation>
 <translation id="8041721485428375115">När du laddar ned installationsprogrammet för fjärranslutningsvärden Chrome Remote Desktop godkänner du Googles <ph name="LINK_BEGIN" />användarvillkor<ph name="LINK_END" />.</translation>
 <translation id="8073845705237259513">Om du vill använda Chrome Remote Desktop måste du lägga till ett Google-konto på enheten.</translation>
 <translation id="80739703311984697">Fjärrvärden kräver att du autentiserar via en tredje parts webbplats. Om du vill fortsätta måste du ge Chromoting ytterligare behörigheter att komma åt den här adressen:</translation>
diff --git a/remoting/webapp/base/js/chromoting_event.js b/remoting/webapp/base/js/chromoting_event.js
index 88cd4f9..7bd21df 100644
--- a/remoting/webapp/base/js/chromoting_event.js
+++ b/remoting/webapp/base/js/chromoting_event.js
@@ -122,6 +122,29 @@
 };
 
 /**
+ * Populates the corresponding fields in the logEntry based on |error|.
+ *
+ * @param {remoting.Error} error
+ */
+remoting.ChromotingEvent.prototype.setError = function(error) {
+  var Tag = remoting.Error.Tag;
+  var detail = /** @type {string} */ (error.getDetail());
+
+  switch (error.getTag()) {
+    case Tag.HOST_IS_OFFLINE:
+      if (detail) {
+        this.xmpp_error = new remoting.ChromotingEvent.XmppError(detail);
+      }
+      break;
+    case Tag.MISSING_PLUGIN:
+      console.assert(detail, 'Missing PNaCl plugin last error string.');
+      this.raw_plugin_error = detail;
+  }
+
+  this.connection_error = error.toConnectionError();
+};
+
+/**
  * @param {remoting.ChromotingEvent} event
  * @return {boolean}
  */
diff --git a/remoting/webapp/base/js/client_session.js b/remoting/webapp/base/js/client_session.js
index 7b3f0cb..38532c647 100644
--- a/remoting/webapp/base/js/client_session.js
+++ b/remoting/webapp/base/js/client_session.js
@@ -456,34 +456,34 @@
 remoting.ClientSession.prototype.onConnectionStatusUpdate =
     function(status, error) {
   if (status == remoting.ClientSession.State.FAILED) {
+    var errorTag = remoting.Error.Tag.UNEXPECTED;
     switch (error) {
       case remoting.ClientSession.ConnectionError.HOST_IS_OFFLINE:
-        this.error_ = new remoting.Error(remoting.Error.Tag.HOST_IS_OFFLINE);
+        errorTag = remoting.Error.Tag.HOST_IS_OFFLINE;
         break;
       case remoting.ClientSession.ConnectionError.SESSION_REJECTED:
-        this.error_ =
-            new remoting.Error(remoting.Error.Tag.INVALID_ACCESS_CODE);
+        errorTag = remoting.Error.Tag.INVALID_ACCESS_CODE;
         break;
       case remoting.ClientSession.ConnectionError.INCOMPATIBLE_PROTOCOL:
-        this.error_ =
-            new remoting.Error(remoting.Error.Tag.INCOMPATIBLE_PROTOCOL);
+        errorTag = remoting.Error.Tag.INCOMPATIBLE_PROTOCOL;
         break;
       case remoting.ClientSession.ConnectionError.NETWORK_FAILURE:
-        this.error_ = new remoting.Error(remoting.Error.Tag.P2P_FAILURE);
+        errorTag = remoting.Error.Tag.P2P_FAILURE;
         break;
       case remoting.ClientSession.ConnectionError.HOST_OVERLOAD:
-        this.error_ = new remoting.Error(remoting.Error.Tag.HOST_OVERLOAD);
+        errorTag = remoting.Error.Tag.HOST_OVERLOAD;
         break;
       case remoting.ClientSession.ConnectionError.MAX_SESSION_LENGTH:
-        this.error_ = new remoting.Error(remoting.Error.Tag.MAX_SESSION_LENGTH);
+        errorTag = remoting.Error.Tag.MAX_SESSION_LENGTH;
         break;
       case remoting.ClientSession.ConnectionError.HOST_CONFIGURATION_ERROR:
-        this.error_ =
-            new remoting.Error(remoting.Error.Tag.HOST_CONFIGURATION_ERROR);
+        errorTag = remoting.Error.Tag.HOST_CONFIGURATION_ERROR;
         break;
       default:
         this.error_ = remoting.Error.unexpected();
     }
+    this.error_ = new remoting.Error(
+        errorTag, this.xmppErrorCache_.getFirstErrorStanza());
   }
   this.setState_(status);
 };
@@ -562,8 +562,7 @@
   this.notifyStateChanges_(oldState, this.state_);
   // Record state count in an UMA enumerated histogram.
   recordState(this.state_);
-  this.logger_.logClientSessionStateChange(
-      this.state_, this.error_, this.xmppErrorCache_.getFirstError());
+  this.logger_.logSessionStateChange(toSessionState(this.state_), this.error_);
 };
 
 /** @private */
@@ -661,6 +660,37 @@
 };
 
 /**
+ * TODO(kelvinp): Consolidate the two enums (crbug.com/504200)
+ * @param {remoting.ClientSession.State} state
+ * @return {remoting.ChromotingEvent.SessionState}
+ */
+function toSessionState(state) {
+  var SessionState = remoting.ChromotingEvent.SessionState;
+  switch(state) {
+    case remoting.ClientSession.State.UNKNOWN:
+      return SessionState.UNKNOWN;
+    case remoting.ClientSession.State.INITIALIZING:
+      return SessionState.INITIALIZING;
+    case remoting.ClientSession.State.CONNECTING:
+      return SessionState.CONNECTING;
+    case remoting.ClientSession.State.AUTHENTICATED:
+      return SessionState.AUTHENTICATED;
+    case remoting.ClientSession.State.CONNECTED:
+      return SessionState.CONNECTED;
+    case remoting.ClientSession.State.CLOSED:
+      return SessionState.CLOSED;
+    case remoting.ClientSession.State.FAILED:
+      return SessionState.CONNECTION_FAILED;
+    case remoting.ClientSession.State.CONNECTION_DROPPED:
+      return SessionState.CONNECTION_DROPPED;
+    case remoting.ClientSession.State.CONNECTION_CANCELED:
+      return SessionState.CONNECTION_CANCELED;
+    default:
+      throw new Error('Unknown session state : ' + state);
+  }
+}
+
+/**
  * @param {remoting.ClientSession.State} previous
  * @param {remoting.ClientSession.State} current
  * @return {remoting.ClientSession.State}
diff --git a/remoting/webapp/base/js/client_session_factory.js b/remoting/webapp/base/js/client_session_factory.js
index 249864e..658d490 100644
--- a/remoting/webapp/base/js/client_session_factory.js
+++ b/remoting/webapp/base/js/client_session_factory.js
@@ -52,7 +52,8 @@
   var clientPlugin;
 
   function OnError(/** !remoting.Error */ error) {
-    logError(logger, error);
+    logger.logSessionStateChange(
+        remoting.ChromotingEvent.SessionState.CONNECTION_FAILED, error);
     base.dispose(signalStrategy);
     base.dispose(clientPlugin);
     throw error;
@@ -64,14 +65,12 @@
     return remoting.identity.getUserInfo();
   }).then(function(/** {email: string, name: string} */ userInfo) {
     logger.logSessionStateChange(
-        remoting.ChromotingEvent.SessionState.SIGNALING,
-        remoting.ChromotingEvent.ConnectionError.NONE);
+        remoting.ChromotingEvent.SessionState.SIGNALING);
     return connectSignaling(userInfo.email, token);
   }).then(function(/** remoting.SignalStrategy */ strategy) {
     signalStrategy = strategy;
     logger.logSessionStateChange(
-        remoting.ChromotingEvent.SessionState.CREATING_PLUGIN,
-        remoting.ChromotingEvent.ConnectionError.NONE);
+        remoting.ChromotingEvent.SessionState.CREATING_PLUGIN);
     return createPlugin(that.container_, that.requiredCapabilities_);
   }).then(function(/** remoting.ClientPlugin */ plugin) {
     clientPlugin = plugin;
@@ -124,31 +123,4 @@
   });
 }
 
-/**
- * Converts |e| to remoting.ChromotingEvent.ConnectionError and logs
- * it to the telemetry service.
- *
- * TODO(kelvinp): Move this block to remoting.SessionLogger and consolidate
- * the code path with xmpp_error.
- *
- * @param {remoting.SessionLogger} logger
- * @param {remoting.Error} e
- */
-function logError(logger, e) {
-  var error = remoting.ChromotingEvent.ConnectionError.UNEXPECTED;
-
-  if (e instanceof remoting.Error) {
-    error = e.toConnectionError();
-
-    if (e.hasTag(remoting.Error.Tag.MISSING_PLUGIN)) {
-      var pluginError = /** @type {string} */ (e.getDetail());
-      console.assert(Boolean(pluginError), 'Missing plugin error string.');
-      logger.setPluginError(pluginError);
-    }
-  }
-
-  logger.logSessionStateChange(
-      remoting.ChromotingEvent.SessionState.CONNECTION_FAILED, error);
-}
-
 })();
diff --git a/remoting/webapp/base/js/client_session_unittest.js b/remoting/webapp/base/js/client_session_unittest.js
index f4a3c99..6f6273a7 100644
--- a/remoting/webapp/base/js/client_session_unittest.js
+++ b/remoting/webapp/base/js/client_session_unittest.js
@@ -76,7 +76,7 @@
     listener = new SessionListener();
     logger = new remoting.SessionLogger(remoting.ChromotingEvent.Role.CLIENT,
                                         base.doNothing);
-    logToServerStub = sinon.stub(logger, 'logClientSessionStateChange');
+    logToServerStub = sinon.stub(logger, 'logSessionStateChange');
   },
   afterEach: function() {
     session.dispose();
@@ -121,13 +121,13 @@
   'Connection error after CONNECTED should raise the CONNECTION_DROPPED event',
   function(assert) {
 
-  var State = remoting.ClientSession.State;
+  var State = remoting.ChromotingEvent.SessionState;
 
   return connect().then(function() {
     var onDisconnected = sinon.stub(listener, 'onDisconnected');
     session.disconnect(new remoting.Error(remoting.Error.Tag.P2P_FAILURE));
     assert.equal(onDisconnected.callCount, 1);
-    assert.equal(logToServerStub.args[2][0], State.CONNECTION_DROPPED);
+    assert.equal(logToServerStub.args[4][0], State.CONNECTION_DROPPED);
   });
 });
 
@@ -136,14 +136,14 @@
   function(assert) {
 
   var PluginError = remoting.ClientSession.ConnectionError;
-  var State = remoting.ClientSession.State;
+  var State = remoting.ChromotingEvent.SessionState;
 
   return connect(PluginError.SESSION_REJECTED).then(function() {
     assert.ok(false, 'Expect connection to fail');
   }).catch(function(/** remoting.Error */ error) {
     assert.ok(error.hasTag(remoting.Error.Tag.INVALID_ACCESS_CODE));
-    assert.equal(logToServerStub.args[1][0], State.FAILED);
-    var errorLogged = /** @type {remoting.Error} */(logToServerStub.args[1][1]);
+    assert.equal(logToServerStub.args[3][0], State.CONNECTION_FAILED);
+    var errorLogged = /** @type {remoting.Error} */(logToServerStub.args[3][1]);
     assert.equal(errorLogged.getTag(), remoting.Error.Tag.INVALID_ACCESS_CODE);
   });
 });
diff --git a/remoting/webapp/base/js/session_logger.js b/remoting/webapp/base/js/session_logger.js
index 3165da2..95eaa73e 100644
--- a/remoting/webapp/base/js/session_logger.js
+++ b/remoting/webapp/base/js/session_logger.js
@@ -52,8 +52,6 @@
   this.mode_ = remoting.ChromotingEvent.Mode.ME2ME;
   /** @private {remoting.ChromotingEvent.AuthMethod} */
   this.authMethod_;
-  /** @private */
-  this.pluginError_ = '';
 
   this.setSessionId_();
 };
@@ -131,13 +129,6 @@
 };
 
 /**
- * @param {string} error  The error string of the plugin error.
- */
-remoting.SessionLogger.prototype.setPluginError = function(error) {
-  this.pluginError_ = error;
-};
-
-/**
  * @return {string} The current session id. This is random GUID, refreshed
  *     every 24hrs.
  */
@@ -162,34 +153,14 @@
 };
 
 /**
- * Logs a client session state change.
- *
- * @param {remoting.ClientSession.State} state
- * @param {!remoting.Error} stateError
- * @param {?remoting.ChromotingEvent.XmppError} xmppError The XMPP error
- *     as described in http://xmpp.org/rfcs/rfc6120.html#stanzas-error.
- *     Set if the connecton error originates from the an XMPP stanza error.
- */
-remoting.SessionLogger.prototype.logClientSessionStateChange = function(
-    state, stateError, xmppError) {
-  this.logSessionStateChange(
-      toSessionState(state),
-      stateError.toConnectionError(),
-      xmppError);
-};
-
-/**
  * @param {remoting.ChromotingEvent.SessionState} state
- * @param {remoting.ChromotingEvent.ConnectionError} error
- * @param {remoting.ChromotingEvent.XmppError=} opt_XmppError
+ * @param {remoting.Error=} opt_error
  */
-remoting.SessionLogger.prototype.logSessionStateChange = function(
-    state, error, opt_XmppError) {
+remoting.SessionLogger.prototype.logSessionStateChange =
+    function(state, opt_error) {
   this.maybeExpireSessionId_();
 
-  var entry = this.makeSessionStateChange_(
-      state, error,
-      /** @type {?remoting.ChromotingEvent.XmppError} */ (opt_XmppError));
+  var entry = this.makeSessionStateChange_(state, opt_error);
   entry.previous_session_state = this.previousSessionState_;
   this.previousSessionState_ = state;
 
@@ -219,22 +190,27 @@
 
 /**
  * @param {remoting.ChromotingEvent.SessionState} state
- * @param {remoting.ChromotingEvent.ConnectionError} error
- * @param {?remoting.ChromotingEvent.XmppError} xmppError
+ * @param {remoting.Error=} opt_error
  * @return {remoting.ChromotingEvent}
  * @private
  */
 remoting.SessionLogger.prototype.makeSessionStateChange_ =
-    function(state, error, xmppError) {
+    function(state, opt_error) {
   var entry = new remoting.ChromotingEvent(
       remoting.ChromotingEvent.Type.SESSION_STATE);
-  entry.connection_error = error;
-  entry.session_state = state;
 
-  if (Boolean(xmppError)) {
-    entry.xmpp_error = xmppError;
+  var ConnectionError = remoting.ChromotingEvent.ConnectionError;
+
+  if (!opt_error) {
+    entry.connection_error = ConnectionError.NONE;
+  } else if (opt_error instanceof remoting.Error) {
+    entry.setError(opt_error);
+  } else {
+    entry.connection_error = ConnectionError.UNKNOWN_ERROR;
   }
 
+  entry.session_state = state;
+
   this.fillEvent_(entry);
   return entry;
 };
@@ -320,9 +296,6 @@
   if (this.authMethod_ != undefined) {
     entry.auth_method = this.authMethod_;
   }
-  if (Boolean(this.pluginError_)) {
-    entry.raw_plugin_error = this.pluginError_;
-  }
   entry.host_version = this.hostVersion_;
   entry.host_os = this.hostOs_;
   entry.host_os_version = this.hostOsVersion_;
@@ -390,37 +363,6 @@
 };
 
 /**
- * TODO(kelvinp): Consolidate the two enums (crbug.com/504200)
- * @param {remoting.ClientSession.State} state
- * @return {remoting.ChromotingEvent.SessionState}
- */
-function toSessionState(state) {
-  var SessionState = remoting.ChromotingEvent.SessionState;
-  switch(state) {
-    case remoting.ClientSession.State.UNKNOWN:
-      return SessionState.UNKNOWN;
-    case remoting.ClientSession.State.INITIALIZING:
-      return SessionState.INITIALIZING;
-    case remoting.ClientSession.State.CONNECTING:
-      return SessionState.CONNECTING;
-    case remoting.ClientSession.State.AUTHENTICATED:
-      return SessionState.AUTHENTICATED;
-    case remoting.ClientSession.State.CONNECTED:
-      return SessionState.CONNECTED;
-    case remoting.ClientSession.State.CLOSED:
-      return SessionState.CLOSED;
-    case remoting.ClientSession.State.FAILED:
-      return SessionState.CONNECTION_FAILED;
-    case remoting.ClientSession.State.CONNECTION_DROPPED:
-      return SessionState.CONNECTION_DROPPED;
-    case remoting.ClientSession.State.CONNECTION_CANCELED:
-      return SessionState.CONNECTION_CANCELED;
-    default:
-      throw new Error('Unknown session state : ' + state);
-  }
-}
-
-/**
  * @param {remoting.SignalStrategy.Type} type
  * @return {remoting.ChromotingEvent.SignalStrategyType}
  */
diff --git a/remoting/webapp/base/js/session_logger_unittest.js b/remoting/webapp/base/js/session_logger_unittest.js
index ba8122e..78f7e45 100644
--- a/remoting/webapp/base/js/session_logger_unittest.js
+++ b/remoting/webapp/base/js/session_logger_unittest.js
@@ -74,7 +74,7 @@
   });
 });
 
-QUnit.test('logClientSessionStateChange()', function(assert){
+QUnit.test('logSessionStateChange()', function(assert){
   var Event = remoting.ChromotingEvent;
 
   logger = new remoting.SessionLogger(Event.Role.CLIENT, logWriter);
@@ -84,9 +84,9 @@
   logger.setHostOs(remoting.ChromotingEvent.Os.OTHER);
   logger.setHostOsVersion('host_os_version');
 
-  logger.logClientSessionStateChange(
-      remoting.ClientSession.State.FAILED,
-      new remoting.Error(remoting.Error.Tag.HOST_IS_OFFLINE), null);
+  logger.logSessionStateChange(
+      remoting.ChromotingEvent.SessionState.CONNECTION_FAILED,
+      new remoting.Error(remoting.Error.Tag.HOST_IS_OFFLINE));
   var sessionId = logger.getSessionId();
 
   assert.ok(sessionId !== null);
@@ -110,7 +110,7 @@
   });
 });
 
-QUnit.test('logClientSessionStateChange() should handle XMPP error',
+QUnit.test('logSessionStateChange() should handle XMPP error',
     function(assert){
   var Event = remoting.ChromotingEvent;
 
@@ -121,11 +121,9 @@
   logger.setHostOs(remoting.ChromotingEvent.Os.OTHER);
   logger.setHostOsVersion('host_os_version');
 
-  var xmppError = new remoting.ChromotingEvent.XmppError('<fake-stanza/>');
-
-  logger.logClientSessionStateChange(
-      remoting.ClientSession.State.FAILED,
-      new remoting.Error(remoting.Error.Tag.HOST_IS_OFFLINE), xmppError);
+  logger.logSessionStateChange(
+      remoting.ChromotingEvent.SessionState.CONNECTION_FAILED,
+      new remoting.Error(remoting.Error.Tag.HOST_IS_OFFLINE, '<fake-stanza/>'));
   var sessionId = logger.getSessionId();
 
   assert.ok(sessionId !== null);
@@ -152,7 +150,7 @@
   });
 });
 
-QUnit.test('logClientSessionStateChange() should handle sessionId change.',
+QUnit.test('logSessionStateChange() should handle sessionId change.',
   function(assert){
   var clock = sinon.useFakeTimers();
   var Event = remoting.ChromotingEvent;
@@ -170,8 +168,8 @@
   clock.tick(remoting.SessionLogger.MAX_SESSION_ID_AGE + 100);
 
   // Logs the event.
-  logger.logClientSessionStateChange(
-      remoting.ClientSession.State.AUTHENTICATED, remoting.Error.none(), null);
+  logger.logSessionStateChange(
+      remoting.ChromotingEvent.SessionState.AUTHENTICATED);
 
   var newSessionId = logger.getSessionId();
   verifyEvent(assert, 0, {
@@ -225,7 +223,7 @@
   });
 });
 
-QUnit.test('logClientSessionStateChange() should log session_duration.',
+QUnit.test('logSessionStateChange() should log session_duration.',
   function(assert){
   var clock = sinon.useFakeTimers();
   var Event = remoting.ChromotingEvent;
@@ -241,8 +239,8 @@
   clock.tick(2500);
 
   // Logs the event.
-  logger.logClientSessionStateChange(
-      remoting.ClientSession.State.CONNECTED, remoting.Error.none(), null);
+  logger.logSessionStateChange(
+    remoting.ChromotingEvent.SessionState.CONNECTED);
 
   verifyEvent(assert, 0, {
     type: Event.Type.SESSION_STATE,
diff --git a/remoting/webapp/base/js/telemetry_event_writer_unittest.js b/remoting/webapp/base/js/telemetry_event_writer_unittest.js
index cf41c9f..0a17ae6d 100644
--- a/remoting/webapp/base/js/telemetry_event_writer_unittest.js
+++ b/remoting/webapp/base/js/telemetry_event_writer_unittest.js
@@ -92,8 +92,7 @@
     chrome.app.window.current().id = 'fake-window-id';
   }).then(function() {
     logger.logSessionStateChange(
-        remoting.ChromotingEvent.SessionState.STARTED,
-        remoting.ChromotingEvent.ConnectionError.NONE);
+        remoting.ChromotingEvent.SessionState.STARTED);
   }).then(function() {
     return service.unbindSession('fake-window-id');
   }).then(function() {
@@ -119,8 +118,8 @@
   return service.init().then(function() {
     chrome.app.window.current().id = 'fake-window-id';
   }).then(function() {
-    logger.logClientSessionStateChange(
-        remoting.ClientSession.State.CONNECTING, remoting.Error.none(), null);
+    logger.logSessionStateChange(
+        remoting.ChromotingEvent.SessionState.CONNECTING);
   }).then(function() {
     return service.unbindSession('fake-window-id');
   }).then(function() {
@@ -147,11 +146,11 @@
   return service.init().then(function() {
     chrome.app.window.current().id = 'fake-window-id';
   }).then(function() {
-    logger.logClientSessionStateChange(
-        remoting.ClientSession.State.CONNECTING, remoting.Error.none(), null);
+    logger.logSessionStateChange(
+        remoting.ChromotingEvent.SessionState.CONNECTING);
   }).then(function() {
-    logger.logClientSessionStateChange(
-        remoting.ClientSession.State.CONNECTED, remoting.Error.none(), null);
+    logger.logSessionStateChange(
+        remoting.ChromotingEvent.SessionState.CONNECTED);
   }).then(function() {
     return service.unbindSession('fake-window-id');
   }).then(function() {
@@ -180,11 +179,11 @@
   return service.init().then(function() {
     chrome.app.window.current().id = 'fake-window-id';
   }).then(function() {
-    logger.logClientSessionStateChange(
-        remoting.ClientSession.State.CONNECTING, remoting.Error.none(), null);
+    logger.logSessionStateChange(
+        remoting.ChromotingEvent.SessionState.CONNECTING);
   }).then(function() {
-    logger.logClientSessionStateChange(
-        remoting.ClientSession.State.FAILED, remoting.Error.none(), null);
+    logger.logSessionStateChange(
+        remoting.ChromotingEvent.SessionState.CONNECTION_FAILED);
   }).then(function() {
     return service.unbindSession('fake-window-id');
   }).then(function() {
diff --git a/remoting/webapp/base/js/xmpp_error_cache.js b/remoting/webapp/base/js/xmpp_error_cache.js
index 79a9138..eabbdb3f 100644
--- a/remoting/webapp/base/js/xmpp_error_cache.js
+++ b/remoting/webapp/base/js/xmpp_error_cache.js
@@ -19,17 +19,16 @@
  */
 
 remoting.XmppErrorCache = function() {
-  /** @private {remoting.ChromotingEvent.XmppError} */
-  this.firstError_ = null;
+  /** @private {string} */
+  this.firstErrorStanza_ = '';
 };
 
 /**
- * @return {remoting.ChromotingEvent.XmppError} The first XMPP error that the
- *     monitor encountered.  Returns null if no errors have been encountered so
- *     far.
+ * @return {string} The first XMPP error stanza that the monitor encountered.
+ *     Returns an empty string if no errors have been encountered so far.
  */
-remoting.XmppErrorCache.prototype.getFirstError = function() {
-  return this.firstError_;
+remoting.XmppErrorCache.prototype.getFirstErrorStanza = function() {
+  return this.firstErrorStanza_;
 };
 
 /**
@@ -38,7 +37,7 @@
  * @param {Element} iqNode
  */
 remoting.XmppErrorCache.prototype.processStanza = function(iqNode) {
-  if (this.firstError_ != null) {
+  if (this.firstErrorStanza_ != '') {
     return;
   }
   // The XML structure is as follows:
@@ -51,7 +50,7 @@
   }
 
   var strippedStanza = this.stripPII_(iqNode);
-  this.firstError_ = new remoting.ChromotingEvent.XmppError(strippedStanza);
+  this.firstErrorStanza_ = strippedStanza;
 };
 
 /**
diff --git a/remoting/webapp/base/js/xmpp_error_cache_unittest.js b/remoting/webapp/base/js/xmpp_error_cache_unittest.js
index f06aa15..8170cd33 100644
--- a/remoting/webapp/base/js/xmpp_error_cache_unittest.js
+++ b/remoting/webapp/base/js/xmpp_error_cache_unittest.js
@@ -18,8 +18,8 @@
   var parser = new DOMParser();
   var xml = parser.parseFromString(stanza, 'text/xml');
   monitor.processStanza(xml.firstElementChild);
-  var error = monitor.getFirstError();
-  assert.equal(error.raw_stanza, expected);
+  var errorStanza = monitor.getFirstErrorStanza();
+  assert.equal(errorStanza, expected);
 }
 
 QUnit.test('should strip PII from session-initiate.', function(assert) {
diff --git a/remoting/webapp/build_template.gni b/remoting/webapp/build_template.gni
index 3b8d9509..370a1436 100644
--- a/remoting/webapp/build_template.gni
+++ b/remoting/webapp/build_template.gni
@@ -197,9 +197,9 @@
     ]
 
     if (enable_pnacl) {
-      pexe_dir = get_label_info(
-              "//remoting/client/plugin:remoting_client_plugin_newlib(//build/toolchain/nacl:newlib_pnacl)",
-              "root_out_dir")
+      pnacl_tc = "//build/toolchain/nacl:newlib_pnacl"
+      pexe_label = "//remoting/client/plugin:remoting_client_plugin_newlib"
+      pexe_dir = get_label_info("${pexe_label}($pnacl_tc)", "root_out_dir")
 
       extra_files += [ "$pexe_dir/remoting_client_plugin_newlib.pexe" ]
       if (is_debug) {
@@ -228,7 +228,10 @@
     ]
 
     if (enable_pnacl) {
-      deps += [ "//remoting/client/plugin:remoting_client_plugin_newlib(//build/toolchain/nacl:newlib_pnacl)" ]
+      deps += [ "${pexe_label}($pnacl_tc)" ]
+      if (is_debug) {
+        deps += [ "${pexe_label}_debug($pnacl_tc)" ]
+      }
     }
 
     # Create a file that contains a list of all the resource files needed
diff --git a/remoting/webapp/crd/js/desktop_remoting_activity.js b/remoting/webapp/crd/js/desktop_remoting_activity.js
index 59b2055..06ebd78b 100644
--- a/remoting/webapp/crd/js/desktop_remoting_activity.js
+++ b/remoting/webapp/crd/js/desktop_remoting_activity.js
@@ -78,8 +78,7 @@
     console.log('Canceled.');
     // Session creation in process, just report it as canceled.
     this.logger_.logSessionStateChange(
-      remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED,
-      remoting.ChromotingEvent.ConnectionError.NONE);
+      remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED);
   }
 };
 
diff --git a/remoting/webapp/crd/js/host_screen.js b/remoting/webapp/crd/js/host_screen.js
index 56890d7..0f2025ae 100644
--- a/remoting/webapp/crd/js/host_screen.js
+++ b/remoting/webapp/crd/js/host_screen.js
@@ -38,9 +38,7 @@
 remoting.tryShare = function() {
   it2meLogger = createLogger_();
   it2meLogger.logSessionStateChange(
-      remoting.ChromotingEvent.SessionState.STARTED,
-      remoting.ChromotingEvent.ConnectionError.NONE,
-      null);
+      remoting.ChromotingEvent.SessionState.STARTED);
 
   /** @type {remoting.It2MeHostFacade} */
   var hostFacade = new remoting.It2MeHostFacade();
@@ -94,9 +92,7 @@
   onNatTraversalPolicyChanged_(true);  // Hide warning by default.
   remoting.setMode(remoting.AppMode.HOST_WAITING_FOR_CODE);
   it2meLogger.logSessionStateChange(
-      remoting.ChromotingEvent.SessionState.CONNECTING,
-      remoting.ChromotingEvent.ConnectionError.NONE,
-      null);
+      remoting.ChromotingEvent.SessionState.CONNECTING);
   document.getElementById('cancel-share-button').disabled = false;
   disableTimeoutCountdown_();
 
@@ -210,18 +206,14 @@
   if (error.hasTag(remoting.Error.Tag.CANCELLED)) {
     remoting.setMode(remoting.AppMode.HOME);
     it2meLogger.logSessionStateChange(
-        remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED,
-        remoting.ChromotingEvent.ConnectionError.NONE,
-        null);
+        remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED);
   } else {
     var errorDiv = document.getElementById('host-plugin-error');
     l10n.localizeElementFromTag(errorDiv, error.getTag());
     console.error('Sharing error: ' + error.toString());
     remoting.setMode(remoting.AppMode.HOST_SHARE_FAILED);
     it2meLogger.logSessionStateChange(
-        remoting.ChromotingEvent.SessionState.CONNECTION_FAILED,
-        error.toConnectionError(),
-        null);
+        remoting.ChromotingEvent.SessionState.CONNECTION_FAILED, error);
   }
 
   cleanUp();
@@ -253,9 +245,7 @@
   try {
     hostSession_.disconnect();
     it2meLogger.logSessionStateChange(
-        remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED,
-        remoting.ChromotingEvent.ConnectionError.NONE,
-        null);
+        remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED);
   } catch (/** @type {*} */ error) {
     console.error('Error disconnecting: ' + error +
                   '. The host probably crashed.');
diff --git a/remoting/webapp/crd/js/it2me_activity.js b/remoting/webapp/crd/js/it2me_activity.js
index 69bf0ce..c05d2192 100644
--- a/remoting/webapp/crd/js/it2me_activity.js
+++ b/remoting/webapp/crd/js/it2me_activity.js
@@ -49,8 +49,7 @@
 
   this.logger_ = this.createLogger_();
   this.logger_.logSessionStateChange(
-      remoting.ChromotingEvent.SessionState.STARTED,
-      remoting.ChromotingEvent.ConnectionError.NONE);
+      remoting.ChromotingEvent.SessionState.STARTED);
 
   this.desktopActivity_ =
       new remoting.DesktopRemotingActivity(this, this.logger_);
diff --git a/remoting/webapp/crd/js/me2me_activity.js b/remoting/webapp/crd/js/me2me_activity.js
index a73ed493..d479df7 100644
--- a/remoting/webapp/crd/js/me2me_activity.js
+++ b/remoting/webapp/crd/js/me2me_activity.js
@@ -54,19 +54,16 @@
 
   var Event = remoting.ChromotingEvent;
   this.logger_ = this.createLogger_(Event.SessionEntryPoint.CONNECT_BUTTON);
-  this.logger_.logSessionStateChange(Event.SessionState.STARTED,
-                                     Event.ConnectionError.NONE);
-
-  var errorTag = Event.ConnectionError.NONE;
+  this.logger_.logSessionStateChange(Event.SessionState.STARTED);
 
   function handleError(/** remoting.Error */ error) {
     if (error.isCancel()) {
       remoting.setMode(remoting.AppMode.HOME);
-      that.logger_.logSessionStateChange(Event.SessionState.CONNECTION_CANCELED,
-                                         errorTag);
+      that.logger_.logSessionStateChange(
+          Event.SessionState.CONNECTION_CANCELED);
     } else {
-      that.logger_.logSessionStateChange(Event.SessionState.CONNECTION_FAILED,
-                                         error.toConnectionError());
+      that.logger_.logSessionStateChange(
+          Event.SessionState.CONNECTION_FAILED, error);
       that.showErrorMessage_(error);
     }
   }
@@ -75,8 +72,7 @@
     return that.host_.options.load();
   }).catch(remoting.Error.handler(function(/** remoting.Error */ error) {
     // User cancels out of the Host upgrade dialog.  Report it as bad version.
-    errorTag = Event.ConnectionError.BAD_VERSION;
-    throw error;
+    throw new remoting.Error(remoting.Error.Tag.BAD_VERSION);
   })).then(
     this.connect_.bind(this)
   ).catch(remoting.Error.handler(handleError));
@@ -118,8 +114,7 @@
 remoting.Me2MeActivity.prototype.reconnect_ = function(entryPoint) {
   this.logger_ = this.createLogger_(entryPoint);
   var Event = remoting.ChromotingEvent;
-  this.logger_.logSessionStateChange(Event.SessionState.STARTED,
-                                     Event.ConnectionError.NONE);
+  this.logger_.logSessionStateChange(Event.SessionState.STARTED);
   this.connect_();
 };
 
diff --git a/sql/connection.cc b/sql/connection.cc
index 3d584a6..44cb597 100644
--- a/sql/connection.cc
+++ b/sql/connection.cc
@@ -1145,7 +1145,7 @@
 
 bool Connection::CommitTransaction() {
   if (!transaction_nesting_) {
-    DLOG_IF(FATAL, !poisoned_) << "Committing back a nonexistent transaction";
+    DLOG_IF(FATAL, !poisoned_) << "Committing a nonexistent transaction";
     return false;
   }
   transaction_nesting_--;
diff --git a/storage/browser/blob/blob_url_request_job.cc b/storage/browser/blob/blob_url_request_job.cc
index deea300..6ec2fe5 100644
--- a/storage/browser/blob/blob_url_request_job.cc
+++ b/storage/browser/blob/blob_url_request_job.cc
@@ -75,37 +75,41 @@
   weak_factory_.InvalidateWeakPtrs();
 }
 
-int BlobURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size) {
+bool BlobURLRequestJob::ReadRawData(net::IOBuffer* dest,
+                                    int dest_size,
+                                    int* bytes_read) {
   TRACE_EVENT_ASYNC_BEGIN1("Blob", "BlobRequest::ReadRawData", this, "uuid",
                            blob_handle_ ? blob_handle_->uuid() : "NotFound");
   DCHECK_NE(dest_size, 0);
+  DCHECK(bytes_read);
 
-  // Bail out immediately if we encounter an error. This happens if a previous
-  // ReadRawData signalled an error to its caller but the caller called
-  // ReadRawData again anyway.
-  if (error_)
-    return 0;
+  // Bail out immediately if we encounter an error.
+  if (error_) {
+    *bytes_read = 0;
+    return true;
+  }
 
-  int bytes_read = 0;
   BlobReader::Status read_status =
-      blob_reader_->Read(dest, dest_size, &bytes_read,
+      blob_reader_->Read(dest, dest_size, bytes_read,
                          base::Bind(&BlobURLRequestJob::DidReadRawData,
                                     weak_factory_.GetWeakPtr()));
 
   switch (read_status) {
     case BlobReader::Status::NET_ERROR:
+      NotifyFailure(blob_reader_->net_error());
       TRACE_EVENT_ASYNC_END1("Blob", "BlobRequest::ReadRawData", this, "uuid",
                              blob_handle_ ? blob_handle_->uuid() : "NotFound");
-      return blob_reader_->net_error();
+      return false;
     case BlobReader::Status::IO_PENDING:
-      return net::ERR_IO_PENDING;
+      SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
+      return false;
     case BlobReader::Status::DONE:
       TRACE_EVENT_ASYNC_END1("Blob", "BlobRequest::ReadRawData", this, "uuid",
                              blob_handle_ ? blob_handle_->uuid() : "NotFound");
-      return bytes_read;
+      return true;
   }
   NOTREACHED();
-  return 0;
+  return true;
 }
 
 bool BlobURLRequestJob::GetMimeType(std::string* mime_type) const {
@@ -218,7 +222,13 @@
 void BlobURLRequestJob::DidReadRawData(int result) {
   TRACE_EVENT_ASYNC_END1("Blob", "BlobRequest::ReadRawData", this, "uuid",
                          blob_handle_ ? blob_handle_->uuid() : "NotFound");
-  ReadRawDataComplete(result);
+  if (result < 0) {
+    NotifyFailure(result);
+    return;
+  }
+  // Clear the IO_PENDING status
+  SetStatus(net::URLRequestStatus());
+  NotifyReadComplete(result);
 }
 
 void BlobURLRequestJob::NotifyFailure(int error_code) {
@@ -226,7 +236,11 @@
 
   // If we already return the headers on success, we can't change the headers
   // now. Instead, we just error out.
-  DCHECK(!response_info_) << "Cannot NotifyFailure after headers.";
+  if (response_info_) {
+    NotifyDone(
+        net::URLRequestStatus(net::URLRequestStatus::FAILED, error_code));
+    return;
+  }
 
   net::HttpStatusCode status_code = net::HTTP_INTERNAL_SERVER_ERROR;
   switch (error_code) {
diff --git a/storage/browser/blob/blob_url_request_job.h b/storage/browser/blob/blob_url_request_job.h
index 1f0b9fb4..21baa2c 100644
--- a/storage/browser/blob/blob_url_request_job.h
+++ b/storage/browser/blob/blob_url_request_job.h
@@ -44,7 +44,7 @@
   // net::URLRequestJob methods.
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetMimeType(std::string* mime_type) const override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
   int GetResponseCode() const override;
diff --git a/storage/browser/fileapi/file_system_dir_url_request_job.cc b/storage/browser/fileapi/file_system_dir_url_request_job.cc
index 2a0984b7..4236fec 100644
--- a/storage/browser/fileapi/file_system_dir_url_request_job.cc
+++ b/storage/browser/fileapi/file_system_dir_url_request_job.cc
@@ -14,6 +14,7 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
 #include "net/base/net_util.h"
 #include "net/url_request/url_request.h"
 #include "storage/browser/fileapi/file_system_context.h"
@@ -43,14 +44,16 @@
 FileSystemDirURLRequestJob::~FileSystemDirURLRequestJob() {
 }
 
-int FileSystemDirURLRequestJob::ReadRawData(net::IOBuffer* dest,
-                                            int dest_size) {
-  int count = std::min(dest_size, base::checked_cast<int>(data_.size()));
+bool FileSystemDirURLRequestJob::ReadRawData(net::IOBuffer* dest,
+                                             int dest_size,
+                                             int* bytes_read) {
+  int count = std::min(dest_size, static_cast<int>(data_.size()));
   if (count > 0) {
     memcpy(dest->data(), data_.data(), count);
     data_.erase(0, count);
   }
-  return count;
+  *bytes_read = count;
+  return true;
 }
 
 void FileSystemDirURLRequestJob::Start() {
@@ -96,7 +99,8 @@
                        false);
       return;
     }
-    NotifyStartError(URLRequestStatus::FromError(net::ERR_FILE_NOT_FOUND));
+    NotifyDone(
+        URLRequestStatus(URLRequestStatus::FAILED, net::ERR_FILE_NOT_FOUND));
     return;
   }
   file_system_context_->operation_runner()->ReadDirectory(
@@ -109,7 +113,8 @@
       file_system_context_->CrackURL(request_->url()).is_valid()) {
     StartAsync();
   } else {
-    NotifyStartError(URLRequestStatus::FromError(net::ERR_FILE_NOT_FOUND));
+    NotifyDone(
+        URLRequestStatus(URLRequestStatus::FAILED, net::ERR_FILE_NOT_FOUND));
   }
 }
 
@@ -121,7 +126,7 @@
     int rv = net::ERR_FILE_NOT_FOUND;
     if (result == base::File::FILE_ERROR_INVALID_URL)
       rv = net::ERR_INVALID_URL;
-    NotifyStartError(URLRequestStatus::FromError(rv));
+    NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
     return;
   }
 
diff --git a/storage/browser/fileapi/file_system_dir_url_request_job.h b/storage/browser/fileapi/file_system_dir_url_request_job.h
index 67104d6..0163535 100644
--- a/storage/browser/fileapi/file_system_dir_url_request_job.h
+++ b/storage/browser/fileapi/file_system_dir_url_request_job.h
@@ -32,7 +32,7 @@
   // URLRequestJob methods:
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool GetCharset(std::string* charset) override;
 
   // FilterContext methods (via URLRequestJob):
diff --git a/storage/browser/fileapi/file_system_url_request_job.cc b/storage/browser/fileapi/file_system_url_request_job.cc
index 6c33fc86..4607dd8 100644
--- a/storage/browser/fileapi/file_system_url_request_job.cc
+++ b/storage/browser/fileapi/file_system_url_request_job.cc
@@ -62,7 +62,6 @@
       file_system_context_(file_system_context),
       is_directory_(false),
       remaining_bytes_(0),
-      range_parse_result_(net::OK),
       weak_factory_(this) {}
 
 FileSystemURLRequestJob::~FileSystemURLRequestJob() {}
@@ -80,28 +79,39 @@
   weak_factory_.InvalidateWeakPtrs();
 }
 
-int FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size) {
+bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest,
+                                          int dest_size,
+                                          int* bytes_read) {
   DCHECK_NE(dest_size, 0);
+  DCHECK(bytes_read);
   DCHECK_GE(remaining_bytes_, 0);
 
   if (reader_.get() == NULL)
-    return net::ERR_FAILED;
+    return false;
 
   if (remaining_bytes_ < dest_size)
-    dest_size = remaining_bytes_;
+    dest_size = static_cast<int>(remaining_bytes_);
 
-  if (!dest_size)
-    return 0;
+  if (!dest_size) {
+    *bytes_read = 0;
+    return true;
+  }
 
   const int rv = reader_->Read(dest, dest_size,
                                base::Bind(&FileSystemURLRequestJob::DidRead,
                                           weak_factory_.GetWeakPtr()));
   if (rv >= 0) {
+    // Data is immediately available.
+    *bytes_read = rv;
     remaining_bytes_ -= rv;
     DCHECK_GE(remaining_bytes_, 0);
+    return true;
   }
-
-  return rv;
+  if (rv == net::ERR_IO_PENDING)
+    SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
+  else
+    NotifyFailed(rv);
+  return false;
 }
 
 bool FileSystemURLRequestJob::GetMimeType(std::string* mime_type) const {
@@ -116,12 +126,8 @@
 void FileSystemURLRequestJob::SetExtraRequestHeaders(
     const net::HttpRequestHeaders& headers) {
   std::string range_header;
-  // Currently this job only cares about the Range header. Note that validation
-  // is deferred to DidGetMetaData(), because NotifyStartError is not legal to
-  // call since the job has not started.
   if (headers.GetHeader(net::HttpRequestHeaders::kRange, &range_header)) {
     std::vector<net::HttpByteRange> ranges;
-
     if (net::HttpUtil::ParseRangeHeader(range_header, &ranges)) {
       if (ranges.size() == 1) {
         byte_range_ = ranges[0];
@@ -129,7 +135,7 @@
         // We don't support multiple range requests in one single URL request.
         // TODO(adamk): decide whether we want to support multiple range
         // requests.
-        range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
+        NotifyFailed(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE);
       }
     }
   }
@@ -161,7 +167,7 @@
   }
   if (!file_system_context_->CanServeURLRequest(url_)) {
     // In incognito mode the API is not usable and there should be no data.
-    NotifyStartError(URLRequestStatus::FromError(net::ERR_FILE_NOT_FOUND));
+    NotifyFailed(net::ERR_FILE_NOT_FOUND);
     return;
   }
   file_system_context_->operation_runner()->GetMetadata(
@@ -175,7 +181,7 @@
       file_system_context_->CrackURL(request_->url()).is_valid()) {
     StartAsync();
   } else {
-    NotifyStartError(URLRequestStatus::FromError(net::ERR_FILE_NOT_FOUND));
+    NotifyFailed(net::ERR_FILE_NOT_FOUND);
   }
 }
 
@@ -183,10 +189,9 @@
     base::File::Error error_code,
     const base::File::Info& file_info) {
   if (error_code != base::File::FILE_OK) {
-    NotifyStartError(URLRequestStatus::FromError(
-        error_code == base::File::FILE_ERROR_INVALID_URL
-            ? net::ERR_INVALID_URL
-            : net::ERR_FILE_NOT_FOUND));
+    NotifyFailed(error_code == base::File::FILE_ERROR_INVALID_URL
+                     ? net::ERR_INVALID_URL
+                     : net::ERR_FILE_NOT_FOUND);
     return;
   }
 
@@ -196,14 +201,8 @@
 
   is_directory_ = file_info.is_directory;
 
-  if (range_parse_result_ != net::OK) {
-    NotifyStartError(URLRequestStatus::FromError(range_parse_result_));
-    return;
-  }
-
   if (!byte_range_.ComputeBounds(file_info.size)) {
-    NotifyStartError(
-        URLRequestStatus::FromError(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+    NotifyFailed(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE);
     return;
   }
 
@@ -227,12 +226,17 @@
 }
 
 void FileSystemURLRequestJob::DidRead(int result) {
-  if (result >= 0) {
-    remaining_bytes_ -= result;
-    DCHECK_GE(remaining_bytes_, 0);
-  }
+  if (result > 0)
+    SetStatus(URLRequestStatus());  // Clear the IO_PENDING status
+  else if (result == 0)
+    NotifyDone(URLRequestStatus());
+  else
+    NotifyFailed(result);
 
-  ReadRawDataComplete(result);
+  remaining_bytes_ -= result;
+  DCHECK_GE(remaining_bytes_, 0);
+
+  NotifyReadComplete(result);
 }
 
 bool FileSystemURLRequestJob::IsRedirectResponse(GURL* location,
@@ -252,4 +256,8 @@
   return false;
 }
 
+void FileSystemURLRequestJob::NotifyFailed(int rv) {
+  NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv));
+}
+
 }  // namespace storage
diff --git a/storage/browser/fileapi/file_system_url_request_job.h b/storage/browser/fileapi/file_system_url_request_job.h
index 308b66c..e442cae3 100644
--- a/storage/browser/fileapi/file_system_url_request_job.h
+++ b/storage/browser/fileapi/file_system_url_request_job.h
@@ -11,7 +11,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "net/base/net_errors.h"
 #include "net/http/http_byte_range.h"
 #include "net/url_request/url_request_job.h"
 #include "storage/browser/fileapi/file_system_url.h"
@@ -42,7 +41,7 @@
   // URLRequestJob methods:
   void Start() override;
   void Kill() override;
-  int ReadRawData(net::IOBuffer* buf, int buf_size) override;
+  bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override;
   bool IsRedirectResponse(GURL* location, int* http_status_code) override;
   void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
   void GetResponseInfo(net::HttpResponseInfo* info) override;
@@ -61,6 +60,7 @@
   void DidGetMetadata(base::File::Error error_code,
                       const base::File::Info& file_info);
   void DidRead(int result);
+  void NotifyFailed(int rv);
 
   const std::string storage_domain_;
   FileSystemContext* file_system_context_;
@@ -69,7 +69,6 @@
   bool is_directory_;
   scoped_ptr<net::HttpResponseInfo> response_info_;
   int64 remaining_bytes_;
-  net::Error range_parse_result_;
   net::HttpByteRange byte_range_;
   base::WeakPtrFactory<FileSystemURLRequestJob> weak_factory_;
 
diff --git a/sync/android/java/src/org/chromium/sync/AndroidSyncSettings.java b/sync/android/java/src/org/chromium/sync/AndroidSyncSettings.java
index acfd063..f00c9719 100644
--- a/sync/android/java/src/org/chromium/sync/AndroidSyncSettings.java
+++ b/sync/android/java/src/org/chromium/sync/AndroidSyncSettings.java
@@ -11,6 +11,7 @@
 import android.os.Bundle;
 import android.os.StrictMode;
 
+import org.chromium.base.Callback;
 import org.chromium.base.ObserverList;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.sync.signin.AccountManagerHelper;
@@ -226,21 +227,22 @@
             mSyncContentResolverDelegate.removePeriodicSync(
                     mAccount, mContractAuthority, Bundle.EMPTY);
         }
-
-        // Disable the syncability of Chrome for all other accounts. Don't use
-        // our cache as we're touching many accounts that aren't signed in, so this saves
-        // extra calls to Android sync configuration.
-        Account[] googleAccounts = AccountManagerHelper.get(mApplicationContext)
-                .getGoogleAccounts();
-        for (Account accountToSetNotSyncable : googleAccounts) {
-            if (!accountToSetNotSyncable.equals(mAccount)
-                    && mSyncContentResolverDelegate.getIsSyncable(
-                            accountToSetNotSyncable, mContractAuthority) > 0) {
-                mSyncContentResolverDelegate.setIsSyncable(accountToSetNotSyncable,
-                        mContractAuthority, 0);
-            }
-        }
         StrictMode.setThreadPolicy(oldPolicy);
+
+        // Disable the syncability of Chrome for all other accounts.
+        AccountManagerHelper.get(mApplicationContext).getGoogleAccounts(new Callback<Account[]>() {
+            @Override
+            public void onResult(Account[] accounts) {
+                StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
+                for (Account account : accounts) {
+                    if (!account.equals(mAccount) && mSyncContentResolverDelegate.getIsSyncable(
+                            account, mContractAuthority) > 0) {
+                        mSyncContentResolverDelegate.setIsSyncable(account, mContractAuthority, 0);
+                    }
+                }
+                StrictMode.setThreadPolicy(oldPolicy);
+            }
+        });
     }
 
     /**
diff --git a/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java b/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java
index 8b1b0c3..6fd2bb4 100644
--- a/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java
+++ b/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java
@@ -150,6 +150,10 @@
         return new Account(name, GOOGLE_ACCOUNT_TYPE);
     }
 
+    /**
+     * Use the asynchronous version below instead. See http://crbug.com/517697.
+     */
+    @Deprecated
     public List<String> getGoogleAccountNames() {
         List<String> accountNames = new ArrayList<String>();
         for (Account account : getGoogleAccounts()) {
@@ -159,9 +163,25 @@
     }
 
     /**
-     * Returns all Google accounts on the device.
-     * @return an array of accounts.
+     * Retrieves a list of the Google account names on the device asynchronously.
      */
+    public void getGoogleAccountNames(final Callback<List<String>> callback) {
+        getGoogleAccounts(new Callback<Account[]>() {
+            @Override
+            public void onResult(Account[] accounts) {
+                List<String> accountNames = new ArrayList<String>();
+                for (Account account : accounts) {
+                    accountNames.add(account.name);
+                }
+                callback.onResult(accountNames);
+            }
+        });
+    }
+
+    /**
+     * Use the asynchronous version below instead. See http://crbug.com/517697.
+     */
+    @Deprecated
     public Account[] getGoogleAccounts() {
         return mAccountManager.getAccountsByType(GOOGLE_ACCOUNT_TYPE);
     }
@@ -173,10 +193,26 @@
         mAccountManager.getAccountsByType(GOOGLE_ACCOUNT_TYPE, callback);
     }
 
+    /**
+     * Use the asynchronous version below instead. See http://crbug.com/517697.
+     */
+    @Deprecated
     public boolean hasGoogleAccounts() {
         return getGoogleAccounts().length > 0;
     }
 
+    /**
+     * Asynchronously determine whether any Google accounts have been added.
+     */
+    public void hasGoogleAccounts(final Callback<Boolean> callback) {
+        getGoogleAccounts(new Callback<Account[]>() {
+            @Override
+            public void onResult(Account[] accounts) {
+                callback.onResult(accounts.length > 0);
+            }
+        });
+    }
+
     private String canonicalizeName(String name) {
         String[] parts = AT_SYMBOL.split(name);
         if (parts.length != 2) return name;
@@ -191,8 +227,9 @@
     }
 
     /**
-     * Returns the account if it exists, null otherwise.
+     * Use the asynchronous version below instead. See http://crbug.com/517697.
      */
+    @Deprecated
     public Account getAccountFromName(String accountName) {
         String canonicalName = canonicalizeName(accountName);
         Account[] accounts = getGoogleAccounts();
@@ -205,13 +242,46 @@
     }
 
     /**
-     * Returns whether the accounts exists.
+     * Asynchronously returns the account if it exists; null otherwise.
      */
+    public void getAccountFromName(String accountName, final Callback<Account> callback) {
+        final String canonicalName = canonicalizeName(accountName);
+        getGoogleAccounts(new Callback<Account[]>() {
+            @Override
+            public void onResult(Account[] accounts) {
+                Account accountForName = null;
+                for (Account account : accounts) {
+                    if (canonicalizeName(account.name).equals(canonicalName)) {
+                        accountForName = account;
+                        break;
+                    }
+                }
+                callback.onResult(accountForName);
+            }
+        });
+    }
+
+    /**
+     * Use the asynchronous version below instead. See http://crbug.com/517697.
+     */
+    @Deprecated
     public boolean hasAccountForName(String accountName) {
         return getAccountFromName(accountName) != null;
     }
 
     /**
+     * Asynchronously returns whether an account exists with the given name.
+     */
+    public void hasAccountForName(String accountName, final Callback<Boolean> callback) {
+        getAccountFromName(accountName, new Callback<Account>() {
+            @Override
+            public void onResult(Account account) {
+                callback.onResult(account != null);
+            }
+        });
+    }
+
+    /**
      * @return Whether or not there is an account authenticator for Google accounts.
      */
     public boolean hasGoogleAccountAuthenticator() {
diff --git a/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java b/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java
index bcd2360..7e81802 100644
--- a/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java
+++ b/sync/android/javatests/src/org/chromium/sync/AndroidSyncSettingsTest.java
@@ -151,6 +151,7 @@
         assertEquals(1, mSyncContentResolverDelegate.mSetIsSyncableCalls);
         assertEquals(1, mSyncContentResolverDelegate.mRemovePeriodicSyncCalls);
         AndroidSyncSettings.updateAccount(mContext, null);
+        getInstrumentation().waitForIdleSync();
         // mAccount was set to be not syncable.
         assertEquals(2, mSyncContentResolverDelegate.mSetIsSyncableCalls);
         assertEquals(1, mSyncContentResolverDelegate.mRemovePeriodicSyncCalls);
@@ -356,6 +357,7 @@
     public void testIsSyncableOnSigninAndNotOnSignout() throws InterruptedException {
         assertTrue(mSyncContentResolverDelegate.getIsSyncable(mAccount, mAuthority) == 1);
         AndroidSyncSettings.updateAccount(mContext, null);
+        getInstrumentation().waitForIdleSync();
         assertTrue(mSyncContentResolverDelegate.getIsSyncable(mAccount, mAuthority) == 0);
         AndroidSyncSettings.updateAccount(mContext, mAccount);
         assertTrue(mSyncContentResolverDelegate.getIsSyncable(mAccount, mAuthority) == 1);
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS
index 3cae431..843b5738 100644
--- a/testing/buildbot/OWNERS
+++ b/testing/buildbot/OWNERS
@@ -1,7 +1,5 @@
-# This is needed because of * in testing/OWNERS .
 # This is reserved for people that are comfortably with buildbot recipes
 # and understand the implications of changing these files.
-set noparent
 
 dpranke@chromium.org
 jam@chromium.org
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 5c5f0ba..082e846e 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -1,10 +1,17 @@
 {
-  "Android Aura Builder (dbg)": {
-    "compile_targets": [
-      "compositor_unittests_apk"
+  "Android Aura Tester (dbg)": {
+    "gtest_tests": [
+      {
+        "test": "base_unittests"
+      },
+      {
+        "test": "compositor_unittests"
+      },
+      {
+        "test": "content_unittests"
+      }
     ]
   },
-  "Android Aura Tester (dbg)": {},
   "Android GN Builder (dbg)": {
     "additional_compile_targets": [
       "blimp_tests",
diff --git a/testing/buildbot/chromium.json b/testing/buildbot/chromium.json
index 0967ef4..c8a312ea 100644
--- a/testing/buildbot/chromium.json
+++ b/testing/buildbot/chromium.json
@@ -1 +1,7 @@
-{}
+{
+  "Linux x64": {
+    "additional_compile_targets": [
+      "all"
+    ]
+  }
+}
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index 4d8c73587..74e3d4a 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -693,6 +693,13 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         }
+      },
+      {
+        "isolate_name": "telemetry_perf_unittests",
+        "name": "telemetry_perf_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        }
       }
     ],
     "scripts": [
@@ -701,10 +708,6 @@
         "script": "telemetry_unittests.py"
       },
       {
-        "name": "telemetry_perf_unittests",
-        "script": "telemetry_perf_unittests.py"
-      },
-      {
         "name": "nacl_integration",
         "script": "nacl_integration.py"
       }
@@ -1137,6 +1140,13 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         }
+      },
+      {
+        "isolate_name": "telemetry_perf_unittests",
+        "name": "telemetry_perf_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        }
       }
     ],
     "scripts": [
@@ -1145,10 +1155,6 @@
         "script": "telemetry_unittests.py"
       },
       {
-        "name": "telemetry_perf_unittests",
-        "script": "telemetry_perf_unittests.py"
-      },
-      {
         "name": "nacl_integration",
         "script": "nacl_integration.py"
       }
@@ -1486,6 +1492,13 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         }
+      },
+      {
+        "isolate_name": "telemetry_perf_unittests",
+        "name": "telemetry_perf_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        }
       }
     ],
     "scripts": [
@@ -2022,6 +2035,13 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         }
+      },
+      {
+        "isolate_name": "telemetry_perf_unittests",
+        "name": "telemetry_perf_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        }
       }
     ],
     "scripts": [
@@ -2030,10 +2050,6 @@
         "script": "telemetry_unittests.py"
       },
       {
-        "name": "telemetry_perf_unittests",
-        "script": "telemetry_perf_unittests.py"
-      },
-      {
         "name": "nacl_integration",
         "script": "nacl_integration.py"
       }
diff --git a/testing/scripts/OWNERS b/testing/scripts/OWNERS
index 9f378a26..7300f35 100644
--- a/testing/scripts/OWNERS
+++ b/testing/scripts/OWNERS
@@ -1,5 +1,6 @@
-# This is needed because of * in testing/OWNERS .
-set noparent
+# This is reserved for people that are comfortably with buildbot recipes
+# and understand the implications of changing these files.
 
+dpranke@chromium.org
 iannucci@chromium.org
 phajdan.jr@chromium.org
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests
index 731bfc0..5a55fe3 100644
--- a/third_party/WebKit/LayoutTests/SlowTests
+++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -91,6 +91,7 @@
 crbug.com/450493 http/tests/inspector/stacktraces/ [ Slow ]
 crbug.com/450493 inspector/profiler/ [ Slow ]
 crbug.com/420008 inspector/tracing/ [ Slow ]
+crbug.com/420008 virtual/syncpaint/inspector/tracing/ [ Slow ]
 crbug.com/420008 virtual/threaded/inspector/tracing/ [ Slow ]
 crbug.com/246190 [ Release ] http/tests/inspector/indexeddb/ [ Slow ]
 
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index d57e29780..690ab95 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -326,8 +326,6 @@
 crbug.com/498539 [ Win7 Debug ] inspector/elements/styles-3/styles-computed-trace.html [ Crash Pass ]
 crbug.com/498539 [ Win7 ] inspector/elements/styles-4/styles-update-from-js.html [ Crash Pass ]
 
-crbug.com/552507 http/tests/serviceworker/registration.html [ Pass Crash Failure ]
-
 crbug.com/248938 [ Win Debug ] virtual/threaded/animations/transition-and-animation-2.html [ Timeout ]
 
 crbug.com/487281 [ Mac ] fast/forms/menulist-narrow-width.html [ Failure ]
@@ -660,12 +658,6 @@
 crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-block-alignment-007.xht [ Failure ]
 crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-table-alignment-003.xht [ Failure ]
 crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-table-alignment-005.xht [ Failure ]
-crbug.com/492664 imported/csswg-test/css-writing-modes-3/line-box-height-vlr-003.xht [ Failure ]
-crbug.com/492664 imported/csswg-test/css-writing-modes-3/line-box-height-vlr-005.xht [ Failure ]
-crbug.com/492664 imported/csswg-test/css-writing-modes-3/line-box-height-vlr-007.xht [ Failure ]
-crbug.com/492664 imported/csswg-test/css-writing-modes-3/line-box-height-vlr-009.xht [ Failure ]
-crbug.com/492664 imported/csswg-test/css-writing-modes-3/line-box-height-vlr-011.xht [ Failure ]
-crbug.com/492664 imported/csswg-test/css-writing-modes-3/line-box-height-vlr-013.xht [ Failure ]
 crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-002.xht [ Failure ]
 crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-003.xht [ Failure ]
 crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-004.xht [ Failure ]
@@ -1025,9 +1017,6 @@
 crbug.com/474798 virtual/syncpaint/fast/repaint/align-self-change-keeping-geometry-grid.html [ Skip ]
 crbug.com/474798 virtual/syncpaint/fast/repaint/justify-self-change-keeping-geometry.html [ Skip ]
 
-crbug.com/548695 fast/forms/datalist/update-range-with-datalist.html [ Failure ]
-
-crbug.com/548705 fast/css/first-line-hover-001.html [ Failure ]
 
 # Temporarily disabled after chromium change
 crbug.com/492511 [ Mac ] fast/text/atsui-negative-spacing-features.html [ Failure ]
@@ -1318,7 +1307,8 @@
 crbug.com/521730 [ Win10 ] svg/text/text-selection-intro-05-t.svg [ Failure ]
 
 crbug.com/550285 [ Mac10.6 ] virtual/syncpaint/compositing/repaint/newly-composited-on-scroll.html [ Failure ]
-crbug.com/550285 [ Mac10.6 ] virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div.html [ Failure ]
+# TODO(radu): receover these tests after the rebaseline for crbug.com/532910
+# crbug.com/550285 [ Mac10.6 ] virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div.html [ Failure ]
 crbug.com/550285 [ Mac10.6 ] virtual/syncpaint/fast/repaint/repaint-during-scroll.html [ Failure ]
 crbug.com/550285 [ XP ] virtual/syncpaint/fast/repaint/float-overflow-right.html [ Failure ]
 
diff --git a/third_party/WebKit/LayoutTests/fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block-expected.txt b/third_party/WebKit/LayoutTests/fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block-expected.txt
new file mode 100644
index 0000000..30af33e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block-expected.txt
@@ -0,0 +1,4 @@
+crbug.com/548017: A positioned element inside a relatively positioned inline should use the width of the inline, rather than the anonymous block created to accomodate block-flow parents, when determining its own width. There should be a green square below
+
+ PASS
+
diff --git a/third_party/WebKit/LayoutTests/fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html b/third_party/WebKit/LayoutTests/fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html
new file mode 100644
index 0000000..35d76f49b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<style>
+#square {
+    width: 50px;
+    height: 20px;
+    background-color: green;
+    display: inline-block;
+}
+#inline-container {
+    display: inline;
+    position: relative;
+}
+#abspos {
+    position: absolute;
+    background-color: green;
+}
+</style>
+<p> crbug.com/548017: A positioned element inside a relatively positioned inline should use the width of the inline, rather than the anonymous block created to accomodate block-flow parents, when determining its own width. There should be a green square below</p>
+<div id="inline-container">
+    <div>
+        <div id="abspos" data-expected-width=50><div id="square"></div><div id="square"></div></div>
+    </div>
+</div>
+<script src="../../../resources/check-layout.js"></script>
+<script type="text/javascript">
+    window.checkLayout("#abspos");
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing-expected.txt b/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing-expected.txt
index 6e72572..8ed67d1 100644
--- a/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing-expected.txt
@@ -1,8 +1,11 @@
 CACACACA
 CACACACA
 CACACACA
+56
+56
 This is a testharness.js-based test.
 FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 282.96875 but got 138.359375
 FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 282.96875 but got 138.359375
+PASS Non-ligature font feature expected to be applied despite letter spacing. 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing.html b/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing.html
index a0e8c374..d0567ff 100644
--- a/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing.html
+++ b/third_party/WebKit/LayoutTests/fast/text/font-ligature-letter-spacing.html
@@ -23,6 +23,14 @@
 font-variant-ligatures: discretionary-ligatures;
 }
 
+.onumDiv {
+-moz-font-feature-settings: "onum" 1;
+-ms-font-feature-settings: "onum" 1;
+-o-font-feature-settings: "onum" 1;
+-webkit-font-feature-settings: "onum" 1;
+font-feature-settings: "onum" 1;
+}
+
 .common {
 font-size: 24px;
 line-height: 100%;
@@ -31,6 +39,10 @@
 font-family: megalopolis;
 }
 
+.noLetterSpace {
+letter-spacing: 0;
+}
+
 p { font-family: serif; font-style: italic; }
 </style>
 
@@ -46,9 +58,18 @@
             }, "Ligature expected not to be applied due to letter spacing.");
     }
 
+    function testLetterSpaceDoesNotPreventOnum() {
+      var elementHeightWithLetterSpacing = onumSpanLetterSpace.getBoundingClientRect().height;
+      var elementHeightRegular = onumSpanRegular.getBoundingClientRect().height;
+      test(function() {
+        assert_equals(elementHeightWithLetterSpacing, elementHeightRegular, "Letter spacing does not prevent enabling 'onum' font feature.");
+        }, "Non-ligature font feature expected to be applied despite letter spacing.");
+    }
+
     function runTest() {
         testLetterSpaceAndLigature(dligSpan);
         testLetterSpaceAndLigature(fontVariantSpan);
+        testLetterSpaceDoesNotPreventOnum();
         done();
     }
 </script>
@@ -65,5 +86,14 @@
 <div class="common">
     <span id="letterSpace">CACACACA</span>
 </div>
+
+<div class="onumDiv common">
+    <span id="onumSpanLetterSpace">56</span>
+</div>
+
+<div class="onumDiv common noLetterSpace">
+    <span id="onumSpanRegular">56</span>
+</div>
+
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index fdfa64b..9c844f4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -603,6 +603,7 @@
     method verify
     method wrapKey
 interface SyncEvent : ExtendableEvent
+    getter lastChance
     getter registration
     method constructor
 interface SyncManager
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel-expected.txt
index 692dd303..39a3de5 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel-expected.txt
@@ -1,3 +1,4 @@
 Animation created
 Animation started
+Animation canceled
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel.html b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel.html
index de25fc5..e11053f9 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel.html
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-create-cancel.html
@@ -15,10 +15,10 @@
     player.cancel();
 }
 
-
 function test()
 {
     InspectorTest.eventHandler["Animation.animationCreated"] = onCreated;
+    InspectorTest.eventHandler["Animation.animationCanceled"] = onCanceled;
     InspectorTest.eventHandler["Animation.animationStarted"] = onStarted;
     InspectorTest.sendCommand("Animation.enable", {});
     InspectorTest.evaluateInPage("startAnimation()", function() {});
@@ -31,6 +31,12 @@
     function onStarted()
     {
         InspectorTest.log("Animation started");
+        InspectorTest.evaluateInPage("cancelAnimation()", function() {});
+    }
+
+    function onCanceled()
+    {
+        InspectorTest.log("Animation canceled");
         InspectorTest.completeTest();
     }
 }
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-empty-transition-cancel-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-empty-transition-cancel-expected.txt
new file mode 100644
index 0000000..a725a91
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-empty-transition-cancel-expected.txt
@@ -0,0 +1,3 @@
+Animation created
+Animation canceled
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-empty-transition-cancel.html b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-empty-transition-cancel.html
new file mode 100644
index 0000000..8be61a2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-empty-transition-cancel.html
@@ -0,0 +1,41 @@
+<html>
+<head>
+<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script>
+<script>
+
+function triggerEmptyTransition()
+{
+    node.offsetTop;
+    node.style.transition = "1s";
+    node.offsetTop;
+    node.style.width = "200px";
+    node.offsetTop;
+    node.style.transition = "";
+    node.offsetTop;
+}
+
+function test()
+{
+    InspectorTest.eventHandler["Animation.animationCreated"] = onCreated;
+    InspectorTest.eventHandler["Animation.animationCanceled"] = onCanceled;
+    InspectorTest.sendCommand("Animation.enable", {});
+    InspectorTest.evaluateInPage("triggerEmptyTransition()", function() {});
+
+    function onCreated()
+    {
+        InspectorTest.log("Animation created");
+    }
+
+    function onCanceled()
+    {
+        InspectorTest.log("Animation canceled");
+        InspectorTest.completeTest();
+    }
+}
+
+</script>
+</head>
+<body onload="runTest()">
+    <div id="node" style="background-color: red; width: 100px"></div>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause-infinite-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause-infinite-expected.txt
new file mode 100644
index 0000000..f175e12
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause-infinite-expected.txt
@@ -0,0 +1,4 @@
+Tests that the animation is correctly paused.
+Animation started
+true
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause-infinite.html b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause-infinite.html
new file mode 100644
index 0000000..3cb267e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause-infinite.html
@@ -0,0 +1,63 @@
+<html>
+<head>
+<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script>
+<script>
+
+var animation;
+
+function startAnimation()
+{
+    animation = node.animate([{ width: "100px" }, { width: "2000px" }], { duration: 10000, iterations: Infinity });
+}
+
+function getWidth()
+{
+    return node.offsetWidth;
+}
+
+function rafWidth(resolve, reject)
+{
+    function frameCallback()
+    {
+        resolve(node.offsetWidth);
+    }
+
+    if (window.testRunner)
+        testRunner.layoutAndPaintAsyncThen(frameCallback);
+}
+
+window.debugTest = true;
+function test()
+{
+    InspectorTest.eventHandler["Animation.animationStarted"] = onStarted;
+    InspectorTest.sendCommand("Animation.enable", {});
+    InspectorTest.evaluateInPage("startAnimation()", function() {});
+
+    function onStarted(response)
+    {
+        InspectorTest.log("Animation started");
+        InspectorTest.sendCommand("Animation.setPaused", { animations: [ response.params.animation.id ], paused: true }, animPaused);
+    }
+
+    function animPaused()
+    {
+        InspectorTest.evaluateInPage("getWidth()", saveWidth);
+    }
+
+    function saveWidth(nodeWidth)
+    {
+        var width = nodeWidth;
+        InspectorTest.invokePageFunctionPromise("rafWidth", []).then(function(result) {
+            InspectorTest.log(result === width);
+            InspectorTest.completeTest();
+        });
+    }
+}
+
+</script>
+</head>
+<body onload="runTest()">
+    Tests that the animation is correctly paused.
+    <div id="node" style="background-color: red; height: 100px"></div>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause.html b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause.html
index c168b0b..2921181a 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause.html
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/animation/animation-pause.html
@@ -22,7 +22,8 @@
         resolve(node.offsetWidth);
     }
 
-    requestAnimationFrame(frameCallback);
+    if (window.testRunner)
+        testRunner.layoutAndPaintAsyncThen(frameCallback);
 }
 
 window.debugTest = true;
@@ -35,7 +36,6 @@
     function onStarted(response)
     {
         InspectorTest.log("Animation started");
-        InspectorTest.evaluateInPage("logPaused()");
         InspectorTest.sendCommand("Animation.setPaused", { animations: [ response.params.animation.id ], paused: true }, animPaused);
     }
 
diff --git a/third_party/WebKit/LayoutTests/inspector/animation/animation-empty-web-animations-expected.txt b/third_party/WebKit/LayoutTests/inspector/animation/animation-empty-web-animations-expected.txt
new file mode 100644
index 0000000..6c1f66e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/animation/animation-empty-web-animations-expected.txt
@@ -0,0 +1,4 @@
+Tests the empty web animations do not show up in animation timeline.
+
+0
+
diff --git a/third_party/WebKit/LayoutTests/inspector/animation/animation-empty-web-animations.html b/third_party/WebKit/LayoutTests/inspector/animation/animation-empty-web-animations.html
new file mode 100644
index 0000000..6f00ef8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/animation/animation-empty-web-animations.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<script src="../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../http/tests/inspector/elements-test.js"></script>
+<script>
+function startAnimation()
+{
+    player = node.animate([], { duration: 200, delay: 100 });
+}
+
+var initialize_Animations = function() {
+
+    InspectorTest.preloadModule("animation");
+}
+
+function test()
+{
+    var timeline = new WebInspector.AnimationTimeline();
+    var elementsPanel = WebInspector.ElementsPanel.instance();
+    elementsPanel.setWidgetBelowDOM(timeline);
+    InspectorTest.addSniffer(WebInspector.AnimationModel.prototype, "animationStarted", animationStarted);
+    InspectorTest.evaluateInPage("startAnimation()");
+
+    function animationStarted()
+    {
+        InspectorTest.addResult(timeline._previewMap.size);
+        InspectorTest.completeTest();
+    }
+}
+
+</script>
+</head>
+
+<body onload="runTest()">
+<p>
+Tests the empty web animations do not show up in animation timeline.
+</p>
+
+<div id="node" style="background-color: red; height: 100px"></div>
+
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt b/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt
index d7483e38..179bf6a 100644
--- a/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt
@@ -3,21 +3,21 @@
 >>>> Animation with start delay only
 WebAnimation
 <div class="animation-name" style="transform: translateX(229.22px); width: 444px;"></div>
-<svg class="animation-ui" height="80" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(222.22px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="32" y2="32" x2="451.44" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 32 L 0.02 13.35 L 0.94 13.35 L 3.51 13.35 L 7.66 13.35 L 13.28 13.35 L 20.28 13.35 L 28.59 13.35 L 38.10 13.35 L 48.73 13.35 L 60.39 13.35 L 72.99 13.35 L 86.44 13.35 L 100.65 13.35 L 115.54 13.35 L 131.00 13.35 L 146.95 13.35 L 163.31 13.35 L 179.98 13.35 L 196.87 13.35 L 213.90 13.35 L 230.96 13.35 L 247.99 13.35 L 264.88 13.35 L 281.54 13.35 L 297.89 13.35 L 313.83 13.35 L 329.28 13.35 L 344.15 13.35 L 358.34 13.35 L 371.77 13.35 L 384.35 13.35 L 395.99 13.35 L 406.60 13.35 L 416.08 13.35 L 424.36 13.35 L 431.33 13.35 L 436.92 13.35 L 441.03 13.35 L 443.56 13.35 L 444.44 13.35 L 444.44 32 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="32" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="451.44" cy="32" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="229.22" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
+<svg class="animation-ui" height="50" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(222.22px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="451.44" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.02 10.85 L 0.94 10.85 L 3.51 10.85 L 7.66 10.85 L 13.28 10.85 L 20.28 10.85 L 28.59 10.85 L 38.10 10.85 L 48.73 10.85 L 60.39 10.85 L 72.99 10.85 L 86.44 10.85 L 100.65 10.85 L 115.54 10.85 L 131.00 10.85 L 146.95 10.85 L 163.31 10.85 L 179.98 10.85 L 196.87 10.85 L 213.90 10.85 L 230.96 10.85 L 247.99 10.85 L 264.88 10.85 L 281.54 10.85 L 297.89 10.85 L 313.83 10.85 L 329.28 10.85 L 344.15 10.85 L 358.34 10.85 L 371.77 10.85 L 384.35 10.85 L 395.99 10.85 L 406.60 10.85 L 416.08 10.85 L 424.36 10.85 L 431.33 10.85 L 436.92 10.85 L 441.03 10.85 L 443.56 10.85 L 444.44 10.85 L 444.44 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="451.44" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="229.22" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
 >>>> Animation with start and end delay
 WebAnimation
 <div class="animation-name" style="transform: translateX(10.28px); width: 600px;"></div>
-<svg class="animation-ui" height="80" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(3.28px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="32" y2="32" x2="663.81" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 32 L 0.03 13.35 L 1.39 13.35 L 5.19 13.35 L 11.32 13.35 L 19.62 13.35 L 29.97 13.35 L 42.25 13.35 L 56.31 13.35 L 72.02 13.35 L 89.25 13.35 L 107.87 13.35 L 127.75 13.35 L 148.75 13.35 L 170.74 13.35 L 193.59 13.35 L 217.17 13.35 L 241.34 13.35 L 265.98 13.35 L 290.94 13.35 L 316.10 13.35 L 341.33 13.35 L 366.49 13.35 L 391.44 13.35 L 416.07 13.35 L 440.23 13.35 L 463.79 13.35 L 486.62 13.35 L 508.59 13.35 L 529.57 13.35 L 549.42 13.35 L 568.01 13.35 L 585.21 13.35 L 600.88 13.35 L 614.90 13.35 L 627.13 13.35 L 637.44 13.35 L 645.70 13.35 L 651.76 13.35 L 655.51 13.35 L 656.81 13.35 L 656.81 32 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="32" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="663.81" cy="32" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="10.28" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="13.57" style="stroke: black; transform: translateX(660.1px);"></line></svg>
+<svg class="animation-ui" height="50" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(3.28px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="663.81" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.03 10.85 L 1.39 10.85 L 5.19 10.85 L 11.32 10.85 L 19.62 10.85 L 29.97 10.85 L 42.25 10.85 L 56.31 10.85 L 72.02 10.85 L 89.25 10.85 L 107.87 10.85 L 127.75 10.85 L 148.75 10.85 L 170.74 10.85 L 193.59 10.85 L 217.17 10.85 L 241.34 10.85 L 265.98 10.85 L 290.94 10.85 L 316.10 10.85 L 341.33 10.85 L 366.49 10.85 L 391.44 10.85 L 416.07 10.85 L 440.23 10.85 L 463.79 10.85 L 486.62 10.85 L 508.59 10.85 L 529.57 10.85 L 549.42 10.85 L 568.01 10.85 L 585.21 10.85 L 600.88 10.85 L 614.90 10.85 L 627.13 10.85 L 637.44 10.85 L 645.70 10.85 L 651.76 10.85 L 655.51 10.85 L 656.81 10.85 L 656.81 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="663.81" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="10.28" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="13.57" style="stroke: black; transform: translateX(660.1px);"></line></svg>
 >>>> Animation with step timing function
 WebAnimation
 <div class="animation-name" style="transform: translateX(7px); width: 666px;"></div>
-<svg class="animation-ui" height="80" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="32" y2="32" x2="673.67" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 32 L 0.03 13.35 L 1.41 13.35 L 5.27 13.35 L 11.49 13.35 L 19.91 13.35 L 30.42 13.35 L 42.88 13.35 L 57.15 13.35 L 73.10 13.35 L 90.59 13.35 L 109.49 13.35 L 129.66 13.35 L 150.98 13.35 L 173.30 13.35 L 196.50 13.35 L 220.43 13.35 L 244.96 13.35 L 269.97 13.35 L 295.31 13.35 L 320.84 13.35 L 346.45 13.35 L 371.98 13.35 L 397.31 13.35 L 422.31 13.35 L 446.83 13.35 L 470.75 13.35 L 493.92 13.35 L 516.22 13.35 L 537.51 13.35 L 557.66 13.35 L 576.53 13.35 L 593.99 13.35 L 609.90 13.35 L 624.13 13.35 L 636.54 13.35 L 647.00 13.35 L 655.38 13.35 L 661.54 13.35 L 665.35 13.35 L 666.67 13.35 L 666.67 32 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="32" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="673.67" cy="32" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
+<svg class="animation-ui" height="50" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="673.67" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.03 10.85 L 1.41 10.85 L 5.27 10.85 L 11.49 10.85 L 19.91 10.85 L 30.42 10.85 L 42.88 10.85 L 57.15 10.85 L 73.10 10.85 L 90.59 10.85 L 109.49 10.85 L 129.66 10.85 L 150.98 10.85 L 173.30 10.85 L 196.50 10.85 L 220.43 10.85 L 244.96 10.85 L 269.97 10.85 L 295.31 10.85 L 320.84 10.85 L 346.45 10.85 L 371.98 10.85 L 397.31 10.85 L 422.31 10.85 L 446.83 10.85 L 470.75 10.85 L 493.92 10.85 L 516.22 10.85 L 537.51 10.85 L 557.66 10.85 L 576.53 10.85 L 593.99 10.85 L 609.90 10.85 L 624.13 10.85 L 636.54 10.85 L 647.00 10.85 L 655.38 10.85 L 661.54 10.85 L 665.35 10.85 L 666.67 10.85 L 666.67 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="673.67" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
 >>>> CSS animation started
 CSSAnimation
 <div class="animation-name" style="transform: translateX(7px); width: 666px;">anim</div>
-<svg class="animation-ui" height="80" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="32" y2="32" x2="673.67" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 32 L 0.52 30.73 L 21.68 28.19 L 42.20 25.67 L 62.11 23.24 L 81.45 20.91 L 100.24 18.74 L 118.53 16.73 L 136.34 14.91 L 153.72 13.28 L 170.70 11.85 L 187.31 10.61 L 203.59 9.54 L 219.57 8.64 L 235.29 7.88 L 250.79 7.27 L 266.09 6.78 L 281.23 6.40 L 296.26 6.12 L 311.20 5.94 L 326.08 5.85 L 340.95 5.85 L 355.83 5.94 L 370.77 6.12 L 385.80 6.40 L 400.95 6.78 L 416.26 7.27 L 431.76 7.88 L 447.48 8.64 L 463.47 9.54 L 479.76 10.61 L 496.38 11.85 L 513.36 13.28 L 530.75 14.91 L 548.58 16.73 L 566.87 18.74 L 585.68 20.91 L 605.03 23.24 L 624.95 25.67 L 645.48 28.19 L 666.67 30.73 L 666.67 32 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="32" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="673.67" cy="32" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
+<svg class="animation-ui" height="50" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="673.67" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.52 24.97 L 21.68 22.90 L 42.20 20.86 L 62.11 18.88 L 81.45 16.99 L 100.24 15.22 L 118.53 13.59 L 136.34 12.11 L 153.72 10.79 L 170.70 9.63 L 187.31 8.62 L 203.59 7.75 L 219.57 7.02 L 235.29 6.41 L 250.79 5.91 L 266.09 5.51 L 281.23 5.20 L 296.26 4.97 L 311.20 4.83 L 326.08 4.76 L 340.95 4.76 L 355.83 4.83 L 370.77 4.97 L 385.80 5.20 L 400.95 5.51 L 416.26 5.91 L 431.76 6.41 L 447.48 7.02 L 463.47 7.75 L 479.76 8.62 L 496.38 9.63 L 513.36 10.79 L 530.75 12.11 L 548.58 13.59 L 566.87 15.22 L 585.68 16.99 L 605.03 18.88 L 624.95 20.86 L 645.48 22.90 L 666.67 24.97 L 666.67 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="673.67" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
 >>>> CSS transition started
 CSSTransition
 <div class="animation-name" style="transform: translateX(7px); width: 666px;">background-color</div>
-<svg class="animation-ui" height="80" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="32" y2="32" x2="673.67" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 32 L 0.02 0.00 L 0.71 0.00 L 2.69 0.00 L 5.90 0.02 L 10.33 0.13 L 15.93 0.38 L 22.68 0.82 L 30.54 1.42 L 39.47 2.17 L 49.44 3.02 L 60.43 3.95 L 72.38 4.93 L 85.28 5.93 L 99.09 6.95 L 113.77 7.96 L 129.29 8.97 L 145.62 9.97 L 162.73 10.96 L 180.57 11.93 L 199.12 12.88 L 218.34 13.82 L 238.20 14.74 L 258.66 15.66 L 279.70 16.56 L 301.28 17.46 L 323.36 18.35 L 345.91 19.24 L 368.90 20.13 L 392.29 21.02 L 416.06 21.91 L 440.16 22.80 L 464.56 23.71 L 489.23 24.62 L 514.14 25.55 L 539.25 26.49 L 564.53 27.44 L 589.95 28.42 L 615.46 29.41 L 641.05 30.43 L 666.67 31.47 L 666.67 32 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="32" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="673.67" cy="32" r="3.5" style="stroke: black; fill: black;"></circle></g><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="32" y2="32" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
+<svg class="animation-ui" height="50" width="680.67" style="margin-left: -7px; transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="673.67" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.02 0.00 L 0.71 0.00 L 2.69 0.00 L 5.90 0.02 L 10.33 0.11 L 15.93 0.31 L 22.68 0.66 L 30.54 1.15 L 39.47 1.76 L 49.44 2.45 L 60.43 3.21 L 72.38 4.00 L 85.28 4.82 L 99.09 5.64 L 113.77 6.47 L 129.29 7.29 L 145.62 8.10 L 162.73 8.90 L 180.57 9.69 L 199.12 10.46 L 218.34 11.23 L 238.20 11.98 L 258.66 12.72 L 279.70 13.46 L 301.28 14.19 L 323.36 14.91 L 345.91 15.63 L 368.90 16.35 L 392.29 17.08 L 416.06 17.80 L 440.16 18.53 L 464.56 19.26 L 489.23 20.01 L 514.14 20.76 L 539.25 21.52 L 564.53 22.30 L 589.95 23.09 L 615.46 23.90 L 641.05 24.72 L 666.67 25.57 L 666.67 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="673.67" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(666.67px);"></line></svg>
 
diff --git a/third_party/WebKit/LayoutTests/platform/android/compositing/color-matching/image-color-matching-expected.png b/third_party/WebKit/LayoutTests/platform/android/compositing/color-matching/image-color-matching-expected.png
new file mode 100644
index 0000000..e1ad463
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/compositing/color-matching/image-color-matching-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/css3/images/cross-fade-background-size-expected.png b/third_party/WebKit/LayoutTests/platform/android/css3/images/cross-fade-background-size-expected.png
new file mode 100644
index 0000000..ed990562
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/css3/images/cross-fade-background-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/color-jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/color-jpeg-with-color-profile-expected.png
new file mode 100644
index 0000000..99ff4ee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/color-jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/jpeg-with-color-profile-expected.png
new file mode 100644
index 0000000..8f4b2b5c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/images/gif-loop-count-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/paletted-png-with-color-profile-expected.png
similarity index 75%
rename from third_party/WebKit/LayoutTests/fast/images/gif-loop-count-expected.png
rename to third_party/WebKit/LayoutTests/platform/android/fast/images/paletted-png-with-color-profile-expected.png
index 8113b17f..2d73757 100644
--- a/third_party/WebKit/LayoutTests/fast/images/gif-loop-count-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/paletted-png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/png-with-color-profile-expected.png
new file mode 100644
index 0000000..8f4b2b5c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossless-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossless-expected.png
new file mode 100644
index 0000000..ff23a59
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossless-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossy-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossy-alpha-expected.png
new file mode 100644
index 0000000..f474bd2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossy-alpha-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossy-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossy-expected.png
new file mode 100644
index 0000000..01cb722
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/images/webp-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/text/font-ligature-letter-spacing-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/text/font-ligature-letter-spacing-expected.txt
new file mode 100644
index 0000000..a8e1fbe9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/fast/text/font-ligature-letter-spacing-expected.txt
@@ -0,0 +1,8 @@
+CACACACA
+CACACACA
+CACACACA
+This is a testharness.js-based test.
+FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 286.546875 but got 140
+FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 286.546875 but got 140
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/android/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/android/scrollbars/listbox-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..638f515
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/android/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..34c5d76f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/custom/group-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/custom/group-opacity-expected.png
new file mode 100644
index 0000000..efc89bd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/svg/custom/group-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/filters/filter-source-position-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/filters/filter-source-position-expected.png
new file mode 100644
index 0000000..01d71b8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/svg/filters/filter-source-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
new file mode 100644
index 0000000..66e7035
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
new file mode 100644
index 0000000..66e7035
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png b/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
new file mode 100644
index 0000000..7611297
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..638f515
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..f603b7c1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..638f515
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..34c5d76f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux-precise/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux-precise/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..2e6c436
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux-precise/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux-x86/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux-x86/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..e04fab9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux-x86/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux-x86/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux-x86/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..2e6c436
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux-x86/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/color-matching/image-color-matching-expected.png b/third_party/WebKit/LayoutTests/platform/linux/compositing/color-matching/image-color-matching-expected.png
index e1ad463..2553678 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/color-matching/image-color-matching-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/color-matching/image-color-matching-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/images/cross-fade-background-size-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/images/cross-fade-background-size-expected.png
index ed990562..bf61a548 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/images/cross-fade-background-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/css3/images/cross-fade-background-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/images/color-jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/color-jpeg-with-color-profile-expected.png
index 99ff4ee..c88fdc81 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/images/color-jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/color-jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/jpeg-with-color-profile-expected.png
index 8f4b2b5c..bf0d4d6 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/images/gif-loop-count-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/paletted-png-with-color-profile-expected.png
similarity index 74%
copy from third_party/WebKit/LayoutTests/fast/images/gif-loop-count-expected.png
copy to third_party/WebKit/LayoutTests/platform/linux/fast/images/paletted-png-with-color-profile-expected.png
index 8113b17f..887a00e 100644
--- a/third_party/WebKit/LayoutTests/fast/images/gif-loop-count-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/paletted-png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/png-with-color-profile-expected.png
index 8f4b2b5c..bf0d4d6 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossless-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossless-expected.png
index ff23a59..6be4ed3e 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossless-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossless-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-alpha-expected.png
index f474bd2..2d3c688b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-alpha-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-alpha-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-expected.png
index 01cb722..54ae7c24 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/images/webp-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-ligature-letter-spacing-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-ligature-letter-spacing-expected.txt
index a8e1fbe9..3a4bb4b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-ligature-letter-spacing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/font-ligature-letter-spacing-expected.txt
@@ -1,8 +1,11 @@
 CACACACA
 CACACACA
 CACACACA
+56
+56
 This is a testharness.js-based test.
 FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 286.546875 but got 140
 FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 286.546875 but got 140
+PASS Non-ligature font feature expected to be applied despite letter spacing. 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/platform/linux/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux/scrollbars/listbox-scrollbar-combinations-expected.png
index 638f515..3ff75d3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux/scrollbars/overflow-scrollbar-combinations-expected.png
index 34c5d76f..e04fab9 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/group-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/group-opacity-expected.png
index efc89bd..a1a055c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/group-opacity-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/group-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-source-position-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-source-position-expected.png
index 01d71b8..c5e8fc2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-source-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-source-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
index 66e7035..3d791af8 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
index 66e7035..3d791af8 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
index 7611297..c122fd2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
index 638f515..3ff75d3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
index f603b7c1..ed4a559b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
index 638f515..3ff75d3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..e04fab9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
index a25cfe4..c4f10a5 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
index f8dacb2..3cffb83 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
index 2c9e34fb..a3a7ea4d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-lion/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
index 9f468ba..6488c145 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-lion/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-lion/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..9b5830f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
new file mode 100644
index 0000000..c4f10a5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-lion/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
index a0edba79..93e9580 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
index 014acec8..cd5c1f0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
index 57a0ec0..4bf02cec 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..c9a91705
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
index b5b768c..f9a5fce1 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..bdabd97
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..9b5830f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
new file mode 100644
index 0000000..93e9580
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..9b5830f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..51dc1bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..51dc1bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..9b5830f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
index 0cb6e63..63ab79df 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
index 2c6f037..093b949 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
index faf7a2bc..180fe7e2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/listbox-scrollbar-combinations-expected.png
index e5c1c600..c2881de 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/overflow-scrollbar-combinations-expected.png
index 092761e..75147c81 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
index dedceb4..295d6e8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
index e5c1c600..c2881de 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
index 092761e..76c2524 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..c2881de
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..75147c81
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
index bdad615..63ab79df 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/color-matching/image-color-matching-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/color-matching/image-color-matching-expected.png
index e249f04f..ede50d9 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/color-matching/image-color-matching-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/color-matching/image-color-matching-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/masks/direct-image-mask-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/masks/direct-image-mask-expected.png
index 4375f651..06a886a 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/masks/direct-image-mask-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/masks/direct-image-mask-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/simple-composited-reflections-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/simple-composited-reflections-expected.png
index 6ac4dcc..4c3c6b42 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/simple-composited-reflections-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/reflections/simple-composited-reflections-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/visibility/visibility-image-layers-expected.png b/third_party/WebKit/LayoutTests/platform/mac/compositing/visibility/visibility-image-layers-expected.png
index 011d1b182..afb08cb8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/visibility/visibility-image-layers-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/visibility/visibility-image-layers-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
index 7bc3656..6817400 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-default-value-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-default-value-expected.png
index f7ba11e..3e9a059 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-default-value-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-default-value-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-different-image-formats-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-different-image-formats-expected.png
index 7bb50d0..7e5b0b0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-different-image-formats-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-different-image-formats-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-gradient-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-gradient-image-expected.png
index 9212e7b..76de26a5 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-gradient-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-gradient-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-color-expected.png
index 51e5e28b..50dd9b0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-color-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-color-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png
index 98170ca6..b4401ee 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-svg-expected.png
index b5b3acc..f003215 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-image-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-multiple-background-layers-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-multiple-background-layers-expected.png
index 41c222df..9c80291 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-multiple-background-layers-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-multiple-background-layers-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-opaque-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-opaque-layer-expected.png
index 7db6576..473f6e9 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-opaque-layer-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-opaque-layer-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-separate-layer-declaration-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-separate-layer-declaration-expected.png
index c5c24af..1f22dc4b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-separate-layer-declaration-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-separate-layer-declaration-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-single-layer-no-blending-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
index 0e5938f2..11a467cd 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-single-layer-no-blending-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-tiled-gradient-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-tiled-gradient-expected.png
index beb99af..fc366962 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-tiled-gradient-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/background-blend-mode-tiled-gradient-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-expected.png
index 82940c3c..aeb31b0d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-stacking-expected.png
index f1e73c8..33158c3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-stacking-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-stacking-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-tiled-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-tiled-expected.png
index d63a0724..acc65273 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-tiled-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/effect-background-blend-mode-tiled-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png
index 11f17c6..9fc3db5 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png
index 9b2e75a..c10e1aa 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png
index a1dd6996..3a7623d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/buffer-offset-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/buffer-offset-expected.png
index 95a1992c..91a05a9d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/buffer-offset-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/buffer-offset-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/composited-reflected-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/composited-reflected-expected.png
index d346eca..41da32c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/composited-reflected-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/composited-reflected-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/crash-filter-change-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/crash-filter-change-expected.png
index 95c9413..d91ab34 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/crash-filter-change-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/crash-filter-change-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-expected.png
index 89fd8eb..90d33ee 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-hw-expected.png
index db07f4e..c9f53fb 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-blur-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-expected.png
index 2bc819e..548f9b8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-hw-expected.png
index 5ce420cc..f6bef69 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-clamping-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-expected.png
index 991540f..6a21898 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-hw-expected.png
index ae143d2..606a895 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-brightness-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-expected.png
index a1b6322..9aa39af3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-hw-expected.png
index c0f03d6f..b9733cf 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-combined-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-expected.png
index 32e0e5e8..62e777f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-hw-expected.png
index e44c393a..2c33b27 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-contrast-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-expected.png
index 7def460..098dabe 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-hw-expected.png
index 037a87a..4465c1846d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-drop-shadow-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-expected.png
index e89b077..8a1f6b0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-hw-expected.png
index 0ae0efd5..f93e95ea 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-grayscale-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-expected.png
index 9efb562..2c46643b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-hw-expected.png
index d62a4326..7be580b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-hue-rotate-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-expected.png
index 09a5128a..b679d3f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-hw-expected.png
index bf2c55bd..b679d3f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-invert-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-expected.png
index e099ac3..ced103c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-hw-expected.png
index e099ac3..ced103c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-opacity-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-expected.png
index 0d69cee..4b666e29 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png
index 1c0905f..384ea576 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.png
index 15a799d..06d60ed 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.png
index f1e139a..b6fab48 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-composite-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-expected.png
index c5ab9e2c..8108b0f60 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-external-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-external-expected.png
index 4b4e484..7806bcd 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-external-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-external-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-expected.png
index 58e47a5..d37b299 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-hw-expected.png
index 89c5e51..9dd5574bd 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hidpi-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hw-expected.png
index 9444c4a..0e401171 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-expected.png
index 581c4ac..8fd95ed 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-hw-expected.png
index bfa8aa5c..25015e727 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-ordering-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-expected.png
index 09c6ee6..0161d74 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-hw-expected.png
index 09c6ee6..0161d74 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-chained-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-colormatrix-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-colormatrix-expected.png
index 2663f39..873b1927 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-colormatrix-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-colormatrix-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-expected.png
index aeb42898..c490064 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png
index 604e63b..740725f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-expected.png
index 68b4643b..2d8e5ef9 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-hw-expected.png
index 463aaac..bfcb3f0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-reference-zoom-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-expected.png
index 2f741cbd..bc0886c53 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-hw-expected.png
index f83ad6a..059efc8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-saturate-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-expected.png
index 05bc6f3..64bd5ff2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-hw-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-hw-expected.png
index 2c4fdd77..f3e5fbd 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-hw-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/effect-sepia-hw-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/regions-expanding-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/regions-expanding-expected.png
index ba85c8f..998ded0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/filters/regions-expanding-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/filters/regions-expanding-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/css3/images/cross-fade-background-size-expected.png b/third_party/WebKit/LayoutTests/platform/mac/css3/images/cross-fade-background-size-expected.png
index 0af7eb2..4baddc4 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/css3/images/cross-fade-background-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/css3/images/cross-fade-background-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
index 93835a7..543d4b4 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
index ec0bf33..be8cdbf 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
index a2b75e1..4b6bb7d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
index a171f081..0b1b4e0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/css/background-shorthand-invalid-url-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/css/background-shorthand-invalid-url-expected.png
index df8e119..421abd2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/css/background-shorthand-invalid-url-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/css/background-shorthand-invalid-url-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/color-jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/color-jpeg-with-color-profile-expected.png
index be616b1..6d18ef7 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/color-jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/color-jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/gif-loop-count-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/gif-loop-count-expected.png
new file mode 100644
index 0000000..834bfddd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/gif-loop-count-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/jpeg-with-color-profile-expected.png
index 16acc66..ae84ba8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/paletted-png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/paletted-png-with-color-profile-expected.png
index 612b9ec..aeaf622e 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/paletted-png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/paletted-png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/png-with-color-profile-expected.png
index 16acc66..ae84ba8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossless-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossless-expected.png
index d69665e..edb09969 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossless-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossless-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-alpha-expected.png
index 4a27cf2e..c88ff1c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-alpha-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-alpha-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-expected.png
index 6d643e4..067a02a 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/images/webp-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/inline/inline-box-background-long-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/inline/inline-box-background-long-image-expected.png
index bc11c78..beebedb 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/inline/inline-box-background-long-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/inline/inline-box-background-long-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-direction-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-direction-expected.png
index 7abc591..998af35 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-direction-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-direction-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-expected.png
index 4ed2568..7057312 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-opacity-expected.png
index 01ef58b..98fb5417 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-opacity-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-outset-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-outset-expected.png
index da4d4a2..8169523b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-outset-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-masks-outset-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-with-zoom-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-with-zoom-expected.png
index 2710719..d0f106d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-with-zoom-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/reflections/reflection-with-zoom-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
index ad59435..76e4e3f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-small-document-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-small-document-expected.png
index 455f7095..cc6a9df 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-small-document-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/repaint/background-image-paint-invalidation-small-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
index 40c111e..6ef0652c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
index 56feecb..7011f81 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background_repeat_space_content_box-expected.png b/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background_repeat_space_content_box-expected.png
index 48a7305..7e3b132 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background_repeat_space_content_box-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/ietestcenter/css3/bordersbackgrounds/background_repeat_space_content_box-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac/scrollbars/listbox-scrollbar-combinations-expected.png
index de2fdb0..0a53ff78 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac/scrollbars/overflow-scrollbar-combinations-expected.png
index 8d2123b..51dc1bc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-04-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-04-t-expected.png
index 1b706a3d..3124175a 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-04-t-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-04-t-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-08-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-08-t-expected.png
index 4bd5a44..6b06d6e5 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-08-t-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/struct-image-08-t-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/group-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/group-opacity-expected.png
index 81ee8f22..05ebf98 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/group-opacity-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/group-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
index d7ae12c..7d5c6376 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-source-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-source-position-expected.png
index eeb7e30..bb01856 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-source-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-source-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/repaint/image-href-change-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/repaint/image-href-change-expected.png
index 275fed4..50351e1 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/repaint/image-href-change-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/repaint/image-href-change-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
index 15f7c07..8a2d8bb9 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
index 15f7c07..8a2d8bb9 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
index 43557608..2b09d40 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug82946-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug82946-2-expected.png
index 7cc4c94..aac39f07 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug82946-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/tables/mozilla/bugs/bug82946-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
index 93835a7..543d4b4 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
index ec0bf33..be8cdbf 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
index a2b75e1..4b6bb7d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
index a171f081..0b1b4e0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/display_list_2d_canvas/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
index 93835a7..543d4b4 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
index ec0bf33..be8cdbf 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
index a2b75e1..4b6bb7d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toBlob-webp-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
index 559b07a..3a9216e 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
index de2fdb0..0a53ff78 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
index 8d2123b..51dc1bc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..0a53ff78
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..51dc1bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
new file mode 100644
index 0000000..76e4e3f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-small-document-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-small-document-expected.png
new file mode 100644
index 0000000..cc6a9df
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-small-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/compositing/visibility/visibility-image-layers-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/compositing/visibility/visibility-image-layers-expected.png
index 011d1b182..afb08cb8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/compositing/visibility/visibility-image-layers-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/threaded/compositing/visibility/visibility-image-layers-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/compositing/color-matching/image-color-matching-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/compositing/color-matching/image-color-matching-expected.png
index a7b4534..6ecd1a7e 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/compositing/color-matching/image-color-matching-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/compositing/color-matching/image-color-matching-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/jpeg-with-color-profile-expected.png
index 350e1d6..50e0a4c 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/png-with-color-profile-expected.png
index 350e1d6..50e0a4c 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/inline/inline-box-background-long-image-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/fast/inline/inline-box-background-long-image-expected.png
index 77a32a52..befcddd 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/inline/inline-box-background-long-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/inline/inline-box-background-long-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/font-ligature-letter-spacing-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/font-ligature-letter-spacing-expected.txt
index a8e1fbe9..3a4bb4b 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/font-ligature-letter-spacing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/font-ligature-letter-spacing-expected.txt
@@ -1,8 +1,11 @@
 CACACACA
 CACACACA
 CACACACA
+56
+56
 This is a testharness.js-based test.
 FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 286.546875 but got 140
 FAIL Ligature expected not to be applied due to letter spacing. assert_equals: Ligature not applied due to letter spacing. expected 286.546875 but got 140
+PASS Non-ligature font feature expected to be applied despite letter spacing. 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..a95f67f5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
index 5ee9fae..b74b5be 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
index 5ee9fae..b74b5be 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
index 7c76379..e13f66b 100644
--- a/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..e02bf47
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..a95f67f5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/color-matching/image-color-matching-expected.png b/third_party/WebKit/LayoutTests/platform/win/compositing/color-matching/image-color-matching-expected.png
index 1b3f698..9df6d58 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/color-matching/image-color-matching-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/color-matching/image-color-matching-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/color-jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/color-jpeg-with-color-profile-expected.png
index 705dbce..dd1d937 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/images/color-jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/color-jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/gif-loop-count-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/gif-loop-count-expected.png
new file mode 100644
index 0000000..6c82e3d9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/gif-loop-count-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/jpeg-with-color-profile-expected.png
index e3e684e..3cd8bc43 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/png-with-color-profile-expected.png
index e3e684e..3cd8bc43 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossless-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossless-expected.png
index fad3f14..ceee27d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossless-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossless-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-alpha-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-alpha-expected.png
index 51a56406..d02b4aa 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-alpha-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-alpha-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-expected.png
index 2dfbd09..c945634f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/images/webp-color-profile-lossy-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/inline/inline-box-background-long-image-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/inline/inline-box-background-long-image-expected.png
index 7ddf0f44..4d77608 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/inline/inline-box-background-long-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/inline/inline-box-background-long-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win/scrollbars/listbox-scrollbar-combinations-expected.png
index ee704c0..c979a83f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win/scrollbars/overflow-scrollbar-combinations-expected.png
index 81aaf57e..dc0207c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/group-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/custom/group-opacity-expected.png
index 89f0ed8..5bc4153 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/group-opacity-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/group-opacity-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-source-position-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-source-position-expected.png
index c5bf884c..af54d677 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-source-position-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-source-position-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
index 22ef0ca..7a8ed66 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
index 22ef0ca..7a8ed66 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-absolute-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png b/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
index 563e2ddb..1a567ab 100644
--- a/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/svg/zoom/page/zoom-svg-through-object-with-percentage-size-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
index ee704c0..c979a83f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
index 81aaf57e..654e2028 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
index ee704c0..c979a83f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..654e2028
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win7/scrollbars/listbox-scrollbar-combinations-expected.png
index 031f5bc..ab0e6b885 100644
--- a/third_party/WebKit/LayoutTests/platform/win7/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win7/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win7/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..654e2028
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win7/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
index 031f5bc..ab0e6b885 100644
--- a/third_party/WebKit/LayoutTests/platform/win7/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/prefer_compositing_to_lcd_text/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
index 031f5bc..ab0e6b885 100644
--- a/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/listbox-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
new file mode 100644
index 0000000..dc0207c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win7/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/implsidepainting/inspector/tracing/frame-model-instrumentation-expected.txt b/third_party/WebKit/LayoutTests/virtual/implsidepainting/inspector/tracing/frame-model-instrumentation-expected.txt
new file mode 100644
index 0000000..eea5ff95
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/implsidepainting/inspector/tracing/frame-model-instrumentation-expected.txt
@@ -0,0 +1,4 @@
+layerTree: object
+mainFrameId: number
+paints: present
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt b/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
new file mode 100644
index 0000000..57a2ae7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
@@ -0,0 +1,15 @@
+Test Automation of Biquad Filters
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Output of bandpass filter with frequency automation equals [0,0.0782652199268341,0.11744670569896698,-0.002010007156059146,-0.031139623373746872,0.0723838210105896,0.04615558311343193,-0.06974676996469498,-0.02473430149257183,0.06254426389932632,-0.02191624790430069,-0.09223899245262146,0.007647276856005192,0.04232903569936752,-0.07107919454574585,-0.07092036306858063,...] with an element-wise tolerance of 0.00005.
+PASS Output of bandpass filter with Q automation equals [0,0.014149743132293224,0.05313149467110634,0.11025312542915344,0.17868348956108093,0.25172680616378784,0.3230687975883484,0.3869902193546295,0.4385446012020111,0.47369763255119324,0.48942655324935913,0.48377954959869385,0.455895334482193,0.40598464012145996,0.3352759778499603,0.24592919647693634,...] with an element-wise tolerance of 0.0000014.
+PASS Output of lowshelf filter with gain automation equals [0,0.47856831550598145,1.5545729398727417,3.054399251937866,4.675719738006592,6.195427417755127,7.4982218742370605,8.538782119750977,9.301715850830078,9.779485702514648,9.966057777404785,9.858304977416992,9.459100723266602,8.779397964477539,7.838820934295654,6.665206432342529,...] with an element-wise tolerance of 0.000008.
+PASS Output of bandpass filter with detune automation equals [0,0.0008333204896189272,0.0014042853144928813,0.0003864644968416542,0.0001289713109144941,0.0012249316787347198,0.0011354259913787246,0.00006134019349701703,0.00048309186240658164,0.0014227250358089805,0.0007017588941380382,-0.000017982178178499453,0.0009253751486539841,0.0013467228272929788,0.0002655529824551195,0.00017780107737053186,...] with an element-wise tolerance of 0.000005.
+PASS Output of peaking filter with automation of all parameters equals [0,0.9876883625984192,-0.30901700258255005,-0.8910065293312073,0.5877852439880371,0.7071067690849304,-0.80901700258255,-0.45399048924446106,0.9510565400123596,0.15643446147441864,-1,0.15643446147441864,0.9510565400123596,-0.45399048924446106,-0.80901700258255,0.7071067690849304,...] with an element-wise tolerance of 0.00033.
+PASS Output of bandpass filter with sinusoidal modulation of bandpass center frequency equals [0,0.0018003738950937986,0.00716581242159009,0.015862563624978065,0.027496544644236565,0.04151911661028862,0.05723972246050835,0.07384545356035233,0.09042731672525406,0.10601259768009186,0.11960244923830032,0.13021349906921387,0.13692189753055573,0.13890819251537323,0.13550083339214325,0.12621651589870453,...] with an element-wise tolerance of 0.000004.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/biquad-automation.html b/third_party/WebKit/LayoutTests/webaudio/biquad-automation.html
new file mode 100644
index 0000000..df36b8f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/biquad-automation.html
@@ -0,0 +1,356 @@
+<!doctype html>
+<html>
+  <head>
+    <title>Biquad Automation Test</title>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+    <script src="resources/biquad-testing.js"></script>
+    <script src="resources/audioparam-testing.js"></script>
+  </head>
+  <body>
+    <script>
+      description("Test Automation of Biquad Filters");
+
+      window.jsTestIsAsync = true;
+
+      // Don't need to run these tests at high sampling rate, so just use a low one to reduce memory
+      // usage and complexity.
+      var sampleRate = 16000;
+
+      // How long to render for each test.
+      var renderDuration = 1;
+
+      var audit = Audit.createTaskRunner();
+
+      // The definition of the linear ramp automation function.
+      function linearRamp(t, v0, v1, t0, t1) {
+        return v0 + (v1 - v0) * (t - t0) / (t1 - t0);
+      }
+
+      // Generate the filter coefficients for the specified filter using the given parameters for
+      // the given duration.  |filterTypeFunction| is a function that returns the filter
+      // coefficients for one set of parameters.  |parameters| is a property bag that contains the
+      // start and end values (as an array) for each of the biquad attributes.  The properties are
+      // |freq|, |Q|, |gain|, and |detune|.  |duration| is the number of seconds for which the
+      // coefficients are generated.
+      //
+      // A property bag with properties |b0|, |b1|, |b2|, |a1|, |a2|.  Each propery is an array
+      // consisting of the coefficients for the time-varying biquad filter.
+      function generateFilterCoefficients(filterTypeFunction, parameters, duration) {
+         var endFrame = Math.ceil(duration * sampleRate);
+         var nCoef = endFrame;
+         var b0 = new Float64Array(nCoef);
+         var b1 = new Float64Array(nCoef);
+         var b2 = new Float64Array(nCoef);
+         var a1 = new Float64Array(nCoef);
+         var a2 = new Float64Array(nCoef);
+
+         var k = 0;
+         // If the property is not given, use the defaults.
+         var freqs = parameters.freq || [350, 350];
+         var qs = parameters.Q || [1, 1];
+         var gains = parameters.gain || [0, 0];
+         var detunes = parameters.detune || [0, 0];
+
+         for (var frame = 0; frame < endFrame; ++frame) {
+            // Apply linear ramp at frame |frame|.
+            var f = linearRamp(frame / sampleRate, freqs[0], freqs[1], 0, duration);
+            var q = linearRamp(frame / sampleRate, qs[0], qs[1], 0, duration);
+            var g = linearRamp(frame / sampleRate, gains[0], gains[1], 0, duration);
+            var d = linearRamp(frame / sampleRate, detunes[0], detunes[1], 0, duration);
+
+            // Compute actual frequency parameter
+            f = f * Math.pow(2, d / 1200);
+
+            // Compute filter coefficients
+            var coef = filterTypeFunction(f / (sampleRate / 2), q, g);
+            b0[k] = coef.b0;
+            b1[k] = coef.b1;
+            b2[k] = coef.b2;
+            a1[k] = coef.a1;
+            a2[k] = coef.a2;
+            ++k;
+         }
+
+         return {b0: b0, b1: b1, b2: b2, a1: a1, a2: a2};
+      }
+
+      // Apply the given time-varying biquad filter to the given signal, |signal|.  |coef| should be
+      // the time-varying coefficients of the filter, as returned by |generateFilterCoefficients|.
+      function timeVaryingFilter(signal, coef) {
+        var length = signal.length;
+        // Use double precision for the internal computations.
+        var y = new Float64Array(length);
+
+        // Prime the pump. (Assumes the signal has length >= 2!)
+        y[0] = coef.b0[0] * signal[0];
+        y[1] = coef.b0[1] * signal[1] + coef.b1[1] * signal[0] - coef.a1[1] * y[0];
+
+        for (var n = 2; n < length; ++n) {
+          y[n] = coef.b0[n] * signal[n] + coef.b1[n] * signal[n-1] + coef.b2[n] * signal[n-2];
+          y[n] -= coef.a1[n] * y[n-1] + coef.a2[n] * y[n-2];
+        }
+
+        // But convert the result to single precision for comparison.
+        return y.map(Math.fround);
+      }
+
+      // Configure the audio graph using |context|.  Returns the biquad filter node and the
+      // AudioBuffer used for the source.
+      function configureGraph(context, toneFrequency) {
+        // The source is just a simple sine wave.
+        var src = context.createBufferSource();
+        var b = context.createBuffer(1, renderDuration * sampleRate, sampleRate);
+        var data = b.getChannelData(0);
+        var omega = 2 * Math.PI * toneFrequency / sampleRate;
+        for (var k = 0; k < data.length; ++k) {
+          data[k] = Math.sin(omega * k);
+        }
+        src.buffer = b;
+        var f = context.createBiquadFilter();
+        src.connect(f);
+        f.connect(context.destination);
+
+        src.start();
+
+        return {filter: f, source: b};
+      }
+
+      function createFilterVerifier(filterCreator, threshold, parameters, input, message) {
+        return function (resultBuffer) {
+          var actual = resultBuffer.getChannelData(0);
+          var coefs = generateFilterCoefficients(filterCreator, parameters, renderDuration);
+
+          reference = timeVaryingFilter(input, coefs);
+
+          Should(message, actual).beCloseToArray(reference, threshold);
+        };
+      }
+
+      // Automate just the frequency parameter.  A bandpass filter is used where the center
+      // frequency is swept across the source (which is a simple tone).
+      audit.defineTask("automate-freq", function (done) {
+        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+        // Center frequency of bandpass filter and also the frequency of the test tone.
+        var centerFreq = 10*440;
+
+        // Sweep the frequency +/- 9*440 Hz from the center.  This should cause the output to low at
+        // the beginning and end of the test where the done is outside the pass band of the filter,
+        // but high in the center where the tone is near the center of the pass band.
+        var parameters = {
+          freq: [centerFreq - 9*440, centerFreq + 9*440]
+        }
+        var graph = configureGraph(context, centerFreq);
+        var f = graph.filter;
+        var b = graph.source;
+
+        f.type = "bandpass";
+        f.frequency.setValueAtTime(parameters.freq[0], 0);
+        f.frequency.linearRampToValueAtTime(parameters.freq[1], renderDuration);
+
+        context.startRendering()
+          .then(createFilterVerifier(createBandpassFilter, 5e-5, parameters, b.getChannelData(0),
+            "Output of bandpass filter with frequency automation"))
+          .then(done);
+      });
+
+      // Automate just the Q parameter.  A bandpass filter is used where the Q of the filter is
+      // swept.
+      audit.defineTask("automate-q", function (done) {
+        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+        // The frequency of the test tone.
+        var centerFreq = 440;
+
+        // Sweep the Q paramter between 1 and 200.  This will cause the output of the filter to pass
+        // most of the tone at the beginning to passing less of the tone at the end.  This is
+        // because we set center frequency of the bandpass filter to be slightly off from the actual
+        // tone.
+        var parameters = {
+          Q: [1, 200],
+          // Center frequency of the bandpass filter is just 25 Hz above the tone frequency.
+          freq: [centerFreq + 25, centerFreq + 25]
+        };
+        var graph = configureGraph(context, centerFreq);
+        var f = graph.filter;
+        var b = graph.source;
+
+        f.type = "bandpass";
+        f.frequency.value = parameters.freq[0];
+        f.Q.setValueAtTime(parameters.Q[0], 0);
+        f.Q.linearRampToValueAtTime(parameters.Q[1], renderDuration);
+
+        context.startRendering()
+          .then(createFilterVerifier(createBandpassFilter, 1.4e-6, parameters, b.getChannelData(0),
+            "Output of bandpass filter with Q automation"))
+          .then(done);
+      });
+
+      // Automate just the gain of the lowshelf filter.  A test tone will be in the lowshelf part of
+      // the filter.  The output will vary as the gain of the lowshelf is changed.
+      audit.defineTask("automate-gain", function (done) {
+        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+        // Frequency of the test tone.
+        var centerFreq = 440;
+
+        // Set the cutoff frequency of the lowshelf to be significantly higher than the test tone.
+        // Sweep the gain from 20 dB to -20 dB.  (We go from 20 to -20 to easily verify that the
+        // filter didn't go unstable.)
+        var parameters = {
+          freq: [3500, 3500],
+          gain: [20, -20]
+        }
+        var graph = configureGraph(context, centerFreq);
+        var f = graph.filter;
+        var b = graph.source;
+
+        f.type = "lowshelf";
+        f.frequency.value = parameters.freq[0];
+        f.gain.setValueAtTime(parameters.gain[0], 0);
+        f.gain.linearRampToValueAtTime(parameters.gain[1], renderDuration);
+
+        context.startRendering()
+          .then(createFilterVerifier(createLowShelfFilter, 8e-6, parameters, b.getChannelData(0),
+            "Output of lowshelf filter with gain automation"))
+          .then(done);
+      });
+
+      // Automate just the detune parameter.  Basically the same test as for the frequncy parameter
+      // but we just use the detune parameter to modulate the frequency parameter.
+      audit.defineTask("automate-detune", function (done) {
+        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+        var centerFreq = 10*440;
+        var parameters = {
+          freq: [centerFreq, centerFreq],
+          detune: [-10*1200, 10*1200]
+        };
+        var graph = configureGraph(context, centerFreq);
+        var f = graph.filter;
+        var b = graph.source;
+
+        f.type = "bandpass";
+        f.frequency.value = parameters.freq[0];
+        f.detune.setValueAtTime(parameters.detune[0], 0);
+        f.detune.linearRampToValueAtTime(parameters.detune[1], renderDuration);
+
+        context.startRendering()
+          .then(createFilterVerifier(createBandpassFilter, 5e-6, parameters, b.getChannelData(0),
+            "Output of bandpass filter with detune automation"))
+          .then(done);
+      });
+
+      // Automate all of the filter parameters at once.  This is a basic check that everything is
+      // working.  A peaking filter is used because it uses all of the parameters.
+      audit.defineTask("automate-all", function (done) {
+        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+        var graph = configureGraph(context, 10*440);
+        var f = graph.filter;
+        var b = graph.source;
+
+        // Sweep all of the filter parameters.  These are pretty much arbitrary.
+        var parameters = {
+          freq: [10000, 100],
+          Q: [f.Q.value, .0001],
+          gain: [f.gain.value, 20],
+          detune: [2400, -2400]
+        };
+
+        f.type = "peaking";
+        // Set starting points for all parameters of the filter.  Start at 10 kHz for the center
+        // frequency, and the defaults for Q and gain.
+        f.frequency.setValueAtTime(parameters.freq[0], 0);
+        f.Q.setValueAtTime(parameters.Q[0], 0);
+        f.gain.setValueAtTime(parameters.gain[0], 0);
+        f.detune.setValueAtTime(parameters.detune[0], 0);
+
+        // Linear ramp each parameter
+        f.frequency.linearRampToValueAtTime(parameters.freq[1], renderDuration);
+        f.Q.linearRampToValueAtTime(parameters.Q[1], renderDuration);
+        f.gain.linearRampToValueAtTime(parameters.gain[1], renderDuration);
+        f.detune.linearRampToValueAtTime(parameters.detune[1], renderDuration);
+
+        context.startRendering()
+          .then(createFilterVerifier(createPeakingFilter, 3.3e-4, parameters, b.getChannelData(0),
+            "Output of peaking filter with automation of all parameters"))
+          .then(done);
+      });
+
+      // Test that modulation of the frequency parameter of the filter works.  A sinusoid of 440 Hz
+      // is the test signal that is applied to a bandpass biquad filter.  The frequency parameter of
+      // the filter is modulated by a sinusoid at 103 Hz, and the frequency modulation varies from
+      // 116 to 412 Hz.  (This test was taken from the description in
+      // https://github.com/WebAudio/web-audio-api/issues/509#issuecomment-94731355)
+      audit.defineTask("modulation", function (done) {
+        var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+        // Create a graph with the sinusoidal source at 440 Hz as the input to a biquad filter.
+        var graph = configureGraph(context, 440);
+        var f = graph.filter;
+        var b = graph.source;
+
+        f.type = "bandpass";
+        f.Q.value = 5;
+        f.frequency.value = 264;
+
+        // Create the modulation source, a sinusoid with frequency 103 Hz and amplitude 148.  (The
+        // amplitude of 148 is added to the filter's frequency value of 264 to produce a sinusoidal
+        // modulation of the frequency parameter from 116 to 412 Hz.)
+        var mod = context.createBufferSource();
+        var mbuffer = context.createBuffer(1, renderDuration * sampleRate, sampleRate);
+        var d = mbuffer.getChannelData(0);
+        var omega = 2 * Math.PI * 103 / sampleRate;
+        for (var k = 0; k < d.length; ++k) {
+          d[k] = 148 * Math.sin(omega * k);
+        }
+        mod.buffer = mbuffer;
+
+        mod.connect(f.frequency);
+      
+        mod.start();
+        context.startRendering()
+          .then(function (resultBuffer) {
+             var actual = resultBuffer.getChannelData(0);
+             // Compute the filter coefficients using the mod sine wave
+             
+             var endFrame = Math.ceil(renderDuration * sampleRate);
+             var nCoef = endFrame;
+             var b0 = new Float64Array(nCoef);
+             var b1 = new Float64Array(nCoef);
+             var b2 = new Float64Array(nCoef);
+             var a1 = new Float64Array(nCoef);
+             var a2 = new Float64Array(nCoef);
+
+             // Generate the filter coefficients when the frequency varies from 116 to 248 Hz using
+             // the 103 Hz sinusoid.
+             for (var k = 0; k < nCoef; ++k) {
+               var freq = f.frequency.value + d[k];
+               var c = createBandpassFilter(freq / (sampleRate / 2), f.Q.value, f.gain.value);
+               b0[k] = c.b0;
+               b1[k] = c.b1;
+               b2[k] = c.b2;
+               a1[k] = c.a1;
+               a2[k] = c.a2;
+             }
+             reference = timeVaryingFilter(b.getChannelData(0),
+               {b0: b0, b1: b1, b2: b2, a1: a1, a2: a2});
+
+             Should("Output of bandpass filter with sinusoidal modulation of bandpass center frequency",
+               actual)
+               .beCloseToArray(reference, 4e-6);
+           })
+          .then(done);
+      });
+
+      // All done!
+      audit.defineTask("finish", function (done) {
+        finishJSTest();
+        done();
+      });
+
+      audit.runTasks();
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/ManualTests/animation/animateTransform-repeat-once.svg b/third_party/WebKit/ManualTests/animation/animateTransform-repeat-once.svg
deleted file mode 100644
index b1951baac..0000000
--- a/third_party/WebKit/ManualTests/animation/animateTransform-repeat-once.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg xmlns='http://www.w3.org/2000/svg'>
-  <rect fill='blue' width='100' height='100'>
-    <animateTransform attributeName="transform" type='translate' from='0,0' to='100,0' dur='2s' repeatCount='2' fill='freeze' />
-  </rect>
-  <text x='10' y='120'>
-    The rect should from 0,0 to 100,0 over 2 seconds, twice.
-  </text>
-</svg>
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
index 5fb96bfd..6c49a69a 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
@@ -136,6 +136,7 @@
         : m_finished(false) { }
 
     void notifyFinished(Resource*) override { m_finished = true; }
+    String debugName() const override { return "TestScriptResourceClient"; }
 
     bool finished() const { return m_finished; }
 
diff --git a/third_party/WebKit/Source/core/animation/Animation.cpp b/third_party/WebKit/Source/core/animation/Animation.cpp
index 734c9f9a..758e2bc5 100644
--- a/third_party/WebKit/Source/core/animation/Animation.cpp
+++ b/third_party/WebKit/Source/core/animation/Animation.cpp
@@ -894,6 +894,8 @@
     m_playState = Idle;
     m_startTime = nullValue();
     m_currentTimePending = false;
+
+    InspectorInstrumentation::didCancelAnimation(m_timeline->document(), m_sequenceNumber);
 }
 
 void Animation::beginUpdatingState()
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
index f68f7a72..7198039 100644
--- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
+++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
@@ -97,6 +97,7 @@
         }
 
         void imageChanged(ImageResource*, const IntRect* = nullptr) override;
+        String debugName() const override { return "CrossfadeSubimageObserverProxy"; }
         void setReady(bool ready) { m_ready = ready; }
     private:
         RawPtrWillBeMember<CSSCrossfadeValue> m_ownerValue;
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
index c93f1ca..8f2ed11 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
@@ -29,6 +29,7 @@
     void didStartFontLoad(FontResource*) override;
     void fontLoaded(FontResource*) override;
     void fontLoadWaitLimitExceeded(FontResource*) override;
+    String debugName() const override { return "RemoteFontFaceSource"; }
 
     // For UMA reporting
     bool hadBlankText() override { return m_histograms.hadBlankText(); }
diff --git a/third_party/WebKit/Source/core/css/StyleRuleImport.h b/third_party/WebKit/Source/core/css/StyleRuleImport.h
index 1e22f0d..bcea473 100644
--- a/third_party/WebKit/Source/core/css/StyleRuleImport.h
+++ b/third_party/WebKit/Source/core/css/StyleRuleImport.h
@@ -67,6 +67,7 @@
         {
             m_ownerRule->setCSSStyleSheet(href, baseURL, charset, sheet);
         }
+        String debugName() const override { return "ImportedStyleSheetClient"; }
     private:
         StyleRuleImport* m_ownerRule;
     };
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index 5cb63c4d..83558c2 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -1579,6 +1579,23 @@
     return nullptr;
 }
 
+static PassRefPtrWillBeRawPtr<CSSValue> consumeOutlineColor(CSSParserTokenRange& range, const CSSParserContext& context)
+{
+    // Outline color has "invert" as additional keyword.
+    // Also, we want to allow the special focus color even in HTML Standard parsing mode.
+    if (range.peek().id() == CSSValueInvert || range.peek().id() == CSSValueWebkitFocusRingColor)
+        return consumeIdent(range);
+    return consumeColor(range, context);
+}
+
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineWidth(CSSParserTokenRange& range, CSSParserMode cssParserMode)
+{
+    CSSValueID id = range.peek().id();
+    if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
+        return consumeIdent(range);
+    return consumeLength(range, cssParserMode, ValueRangeNonNegative);
+}
+
 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty)
 {
     CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
@@ -1707,6 +1724,12 @@
         return consumeMotionRotation(m_range, m_context.mode());
     case CSSPropertyWebkitTextEmphasisStyle:
         return consumeTextEmphasisStyle(m_range);
+    case CSSPropertyOutlineColor:
+        return consumeOutlineColor(m_range, m_context);
+    case CSSPropertyOutlineOffset:
+        return consumeLength(m_range, m_context.mode(), ValueRangeAll);
+    case CSSPropertyOutlineWidth:
+        return consumeLineWidth(m_range, m_context.mode());
     default:
         return nullptr;
     }
@@ -2185,6 +2208,8 @@
         return consumeShorthandGreedily(motionShorthand(), important);
     case CSSPropertyWebkitTextEmphasis:
         return consumeShorthandGreedily(webkitTextEmphasisShorthand(), important);
+    case CSSPropertyOutline:
+        return consumeShorthandGreedily(outlineShorthand(), important);
     default:
         m_currentShorthand = oldShorthand;
         return false;
diff --git a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
index 8c378d59..3b39657f 100644
--- a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
@@ -419,14 +419,6 @@
         }
         break;
 
-    case CSSPropertyOutlineColor:        // <color> | invert | inherit
-        // Outline color has "invert" as additional keyword.
-        // Also, we want to allow the special focus color even in HTML Standard parsing mode.
-        if (id == CSSValueInvert || id == CSSValueWebkitFocusRingColor) {
-            validPrimitive = true;
-            break;
-        }
-        /* nobreak */
     case CSSPropertyBackgroundColor: // <color> | inherit
     case CSSPropertyBorderTopColor: // <color> | inherit
     case CSSPropertyBorderRightColor:
@@ -607,7 +599,6 @@
             unitless = FUnitlessQuirk;
         // fall through
     case CSSPropertyWebkitTextStrokeWidth:
-    case CSSPropertyOutlineWidth: // <border-width> | inherit
     case CSSPropertyWebkitBorderStartWidth:
     case CSSPropertyWebkitBorderEndWidth:
     case CSSPropertyWebkitBorderBeforeWidth:
@@ -748,9 +739,6 @@
     case CSSPropertyBorderRadius:
     case CSSPropertyAliasWebkitBorderRadius:
         return parseBorderRadius(unresolvedProperty, important);
-    case CSSPropertyOutlineOffset:
-        validPrimitive = validUnit(value, FLength);
-        break;
     case CSSPropertyWebkitBoxReflect:
         if (id == CSSValueNone)
             validPrimitive = true;
@@ -1021,9 +1009,6 @@
         return parseShorthand(propId, webkitBorderBeforeShorthand(), important);
     case CSSPropertyWebkitBorderAfter:
         return parseShorthand(propId, webkitBorderAfterShorthand(), important);
-    case CSSPropertyOutline:
-        // [ 'outline-color' || 'outline-style' || 'outline-width' ] | inherit
-        return parseShorthand(propId, outlineShorthand(), important);
     case CSSPropertyBorderColor:
         // <color>{1,4} | inherit
         return parse4Values(propId, borderColorShorthand().properties(), important);
@@ -1188,6 +1173,10 @@
     case CSSPropertyWebkitTextEmphasisColor:
     case CSSPropertyWebkitTextEmphasisStyle:
     case CSSPropertyWebkitTextEmphasis:
+    case CSSPropertyOutline:
+    case CSSPropertyOutlineColor:
+    case CSSPropertyOutlineWidth:
+    case CSSPropertyOutlineOffset:
         validPrimitive = false;
         break;
 
diff --git a/third_party/WebKit/Source/core/dom/DocumentTiming.cpp b/third_party/WebKit/Source/core/dom/DocumentTiming.cpp
index 1cf519f6..1b339f4 100644
--- a/third_party/WebKit/Source/core/dom/DocumentTiming.cpp
+++ b/third_party/WebKit/Source/core/dom/DocumentTiming.cpp
@@ -22,6 +22,11 @@
     visitor->trace(m_document);
 }
 
+LocalFrame* DocumentTiming::frame() const
+{
+    return m_document ? m_document->frame() : nullptr;
+}
+
 void DocumentTiming::notifyDocumentTimingChanged()
 {
     if (m_document && m_document->loader())
@@ -31,63 +36,63 @@
 void DocumentTiming::markDomLoading()
 {
     m_domLoading = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "domLoading", m_domLoading);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "domLoading", m_domLoading, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markDomInteractive()
 {
     m_domInteractive = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "domInteractive", m_domInteractive);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "domInteractive", m_domInteractive, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markDomContentLoadedEventStart()
 {
     m_domContentLoadedEventStart = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "domContentLoadedEventStart", m_domContentLoadedEventStart);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "domContentLoadedEventStart", m_domContentLoadedEventStart, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markDomContentLoadedEventEnd()
 {
     m_domContentLoadedEventEnd = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "domContentLoadedEventEnd", m_domContentLoadedEventEnd);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "domContentLoadedEventEnd", m_domContentLoadedEventEnd, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markDomComplete()
 {
     m_domComplete = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "domComplete", m_domComplete);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "domComplete", m_domComplete, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markFirstLayout()
 {
     m_firstLayout = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "firstLayout", m_firstLayout);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "firstLayout", m_firstLayout, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markFirstPaint()
 {
     m_firstPaint = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "firstPaint", m_firstPaint);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "firstPaint", m_firstPaint, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markFirstTextPaint()
 {
     m_firstTextPaint = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "firstTextPaint", m_firstTextPaint);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "firstTextPaint", m_firstTextPaint, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentTiming::markFirstImagePaint()
 {
     m_firstImagePaint = monotonicallyIncreasingTime();
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "firstImagePaint", m_firstImagePaint);
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "firstImagePaint", m_firstImagePaint, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
diff --git a/third_party/WebKit/Source/core/dom/DocumentTiming.h b/third_party/WebKit/Source/core/dom/DocumentTiming.h
index 68746cd..75a188e 100644
--- a/third_party/WebKit/Source/core/dom/DocumentTiming.h
+++ b/third_party/WebKit/Source/core/dom/DocumentTiming.h
@@ -31,6 +31,7 @@
 namespace blink {
 
 class Document;
+class LocalFrame;
 
 class DocumentTiming final {
     DISALLOW_NEW();
@@ -61,6 +62,7 @@
     DECLARE_TRACE();
 
 private:
+    LocalFrame* frame() const;
     void notifyDocumentTimingChanged();
 
     double m_domLoading = 0.0;
diff --git a/third_party/WebKit/Source/core/dom/PendingScript.h b/third_party/WebKit/Source/core/dom/PendingScript.h
index 90be100c..4f42d09 100644
--- a/third_party/WebKit/Source/core/dom/PendingScript.h
+++ b/third_party/WebKit/Source/core/dom/PendingScript.h
@@ -73,8 +73,9 @@
 
     void setScriptResource(ScriptResource*);
 
-    virtual void notifyFinished(Resource*);
-    virtual void notifyAppendData(ScriptResource*);
+    void notifyFinished(Resource*) override;
+    String debugName() const override { return "PendingScript"; }
+    void notifyAppendData(ScriptResource*) override;
 
     DECLARE_TRACE();
 
diff --git a/third_party/WebKit/Source/core/dom/ProcessingInstruction.h b/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
index 419100f5..2d97897 100644
--- a/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
+++ b/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
@@ -98,6 +98,8 @@
     void parseStyleSheet(const String& sheet);
     void clearSheet();
 
+    String debugName() const override { return "ProcessingInstruction"; }
+
     String m_target;
     String m_localHref;
     String m_title;
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.h b/third_party/WebKit/Source/core/dom/ScriptLoader.h
index 7e688ab..b449c45 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.h
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -99,6 +99,7 @@
 
     // ResourceClient
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "ScriptLoader"; }
 
     RawPtrWillBeMember<Element> m_element;
     ResourcePtr<ScriptResource> m_resource;
diff --git a/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h b/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
index 49a90be..6e2b0b9 100644
--- a/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
+++ b/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
@@ -38,6 +38,7 @@
     ~DocumentResourceReference() override { m_document->removeClient(this); }
     DocumentResource* document() { return m_document.get(); }
 private:
+    String debugName() const override { return "DocumentResourceReference"; }
     ResourcePtr<DocumentResource> m_document;
 };
 
diff --git a/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h b/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
index ee643ee..e802be3 100644
--- a/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
+++ b/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
@@ -50,6 +50,7 @@
     }
 
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "MockImageResourceClient"; }
 
     int imageChangedCount() const { return m_imageChangedCount; }
     bool notifyFinishedCalled() const { return m_notifyFinishedCalled; }
diff --git a/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp b/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
index 617b1161..7ba043a 100644
--- a/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
@@ -89,10 +89,11 @@
     ~DummyClient() override {}
 
     // ResourceClient implementation.
-    virtual void notifyFinished(Resource* resource)
+    void notifyFinished(Resource* resource) override
     {
         m_called = true;
     }
+    String debugName() const override { return "DummyClient"; }
 
     bool called() { return m_called; }
 private:
@@ -110,13 +111,15 @@
     ~AddingClient() override {}
 
     // ResourceClient implementation.
-    virtual void notifyFinished(Resource* resource)
+    void notifyFinished(Resource* resource) override
     {
         // First schedule an asynchronous task to remove the client.
         // We do not expect the client to be called.
         m_removeClientTimer.startOneShot(0, BLINK_FROM_HERE);
         resource->addClient(m_dummyClient);
     }
+    String debugName() const override { return "AddingClient"; }
+
     void removeClient(Timer<AddingClient>* timer)
     {
         m_resource->removeClient(m_dummyClient);
@@ -156,11 +159,12 @@
     ~RemovingClient() override {}
 
     // ResourceClient implementation.
-    virtual void notifyFinished(Resource* resource)
+    void notifyFinished(Resource* resource) override
     {
         resource->removeClient(m_dummyClient);
         resource->removeClient(this);
     }
+    String debugName() const override { return "RemovingClient"; }
 private:
     DummyClient* m_dummyClient;
 };
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp
index 15fbaa8d..f671d27 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
@@ -512,6 +512,56 @@
         && !m_protectorCount;
 }
 
+String Resource::reasonNotDeletable() const
+{
+    StringBuilder builder;
+    if (hasClients()) {
+        builder.append("hasClients(");
+        builder.appendNumber(m_clients.size());
+        if (!m_clientsAwaitingCallback.isEmpty()) {
+            builder.append(", AwaitingCallback=");
+            builder.appendNumber(m_clientsAwaitingCallback.size());
+        }
+        if (!m_finishedClients.isEmpty()) {
+            builder.append(", Finished=");
+            builder.appendNumber(m_finishedClients.size());
+        }
+        builder.append(")");
+    }
+    if (m_loader) {
+        if (!builder.isEmpty())
+            builder.append(' ');
+        builder.append("m_loader");
+    }
+    if (m_preloadCount) {
+        if (!builder.isEmpty())
+            builder.append(' ');
+        builder.append("m_preloadCount(");
+        builder.appendNumber(m_preloadCount);
+        builder.append(")");
+    }
+    if (!hasRightHandleCountApartFromCache(0)) {
+        if (!builder.isEmpty())
+            builder.append(' ');
+        builder.append("m_handleCount(");
+        builder.appendNumber(m_handleCount);
+        builder.append(")");
+    }
+    if (m_protectorCount) {
+        if (!builder.isEmpty())
+            builder.append(' ');
+        builder.append("m_protectorCount(");
+        builder.appendNumber(m_protectorCount);
+        builder.append(")");
+    }
+    if (memoryCache()->contains(this)) {
+        if (!builder.isEmpty())
+            builder.append(' ');
+        builder.append("in_memory_cache");
+    }
+    return builder.toString();
+}
+
 bool Resource::hasOneHandle() const
 {
     return hasRightHandleCountApartFromCache(1);
@@ -729,6 +779,7 @@
 void Resource::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProcessMemoryDump* memoryDump) const
 {
     static const size_t kMaxURLReportLength = 128;
+    static const int kMaxResourceClientToShowInMemoryInfra = 10;
 
     const String dumpName = getMemoryDumpName();
     WebMemoryAllocatorDump* dump = memoryDump->createMemoryAllocatorDump(dumpName);
@@ -751,6 +802,33 @@
             urlToReport = urlToReport + "...";
         }
         dump->addString("url", "", urlToReport);
+
+        dump->addString("reason_not_deletable", "", reasonNotDeletable());
+
+        Vector<String> clientNames;
+        ResourceClientWalker<ResourceClient> walker(m_clients);
+        while (ResourceClient* client = walker.next())
+            clientNames.append(client->debugName());
+        ResourceClientWalker<ResourceClient> walker2(m_clientsAwaitingCallback);
+        while (ResourceClient* client = walker2.next())
+            clientNames.append("(awaiting) " + client->debugName());
+        ResourceClientWalker<ResourceClient> walker3(m_finishedClients);
+        while (ResourceClient* client = walker3.next())
+            clientNames.append("(finished) " + client->debugName());
+        std::sort(clientNames.begin(), clientNames.end(), codePointCompareLessThan);
+
+        StringBuilder builder;
+        for (size_t i = 0; i < clientNames.size() && i < kMaxResourceClientToShowInMemoryInfra; ++i) {
+            if (i > 0)
+                builder.append(" / ");
+            builder.append(clientNames[i]);
+        }
+        if (clientNames.size() > kMaxResourceClientToShowInMemoryInfra) {
+            builder.append(" / and ");
+            builder.appendNumber(clientNames.size() - kMaxResourceClientToShowInMemoryInfra);
+            builder.append(" more");
+        }
+        dump->addString("ResourceClient", "", builder.toString());
     }
 
     const String overheadName = dumpName + "/metadata";
diff --git a/third_party/WebKit/Source/core/fetch/Resource.h b/third_party/WebKit/Source/core/fetch/Resource.h
index 9af0d10..5f864ae 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.h
+++ b/third_party/WebKit/Source/core/fetch/Resource.h
@@ -209,6 +209,7 @@
 
     bool hasOneHandle() const;
     bool canDelete() const;
+    String reasonNotDeletable() const;
 
     // List of acceptable MIME types separated by ",".
     // A MIME type may contain a wildcard, e.g. "text/*".
diff --git a/third_party/WebKit/Source/core/fetch/ResourceClient.h b/third_party/WebKit/Source/core/fetch/ResourceClient.h
index ae4b7762..08be8fc5 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceClient.h
+++ b/third_party/WebKit/Source/core/fetch/ResourceClient.h
@@ -28,6 +28,7 @@
 #include "core/CoreExport.h"
 #include "platform/network/ResourceLoadPriority.h"
 #include "wtf/Forward.h"
+#include "wtf/text/WTFString.h"
 
 namespace blink {
 class Resource;
@@ -52,6 +53,9 @@
 
     virtual ResourcePriority computeResourcePriority() const { return ResourcePriority(); }
 
+    // Name for debugging, e.g. shown in memory-infra.
+    virtual String debugName() const = 0;
+
 protected:
     ResourceClient() { }
 };
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index 593c65b..252ee3e 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -470,7 +470,6 @@
         NotificationShowEvent = 565,
         CSSXGetComputedStyleQueries = 566,
         SVG1DOM = 567,
-        SVGPathSegDOM = 568,
         SVGTransformListConsolidate = 569,
         SVGAnimatedTransformListBaseVal = 570,
         QuotedAnimationName = 571,
@@ -568,14 +567,12 @@
         XMLHttpRequestAsynchronous = 677,
         WhiteSpacePreFromXMLSpace = 679,
         WhiteSpaceNowrapFromXMLSpace = 680,
-        WindowMoveResizeMissingArguments = 684,
         SVGSVGElementForceRedraw = 685,
         SVGSVGElementSuspendRedraw = 686,
         SVGSVGElementUnsuspendRedraw = 687,
         SVGSVGElementUnsuspendRedrawAll = 688,
         AudioContextClose = 689,
         CSSZoomNotEqualToOne = 691,
-        SVGGraphicsElementGetTransformToElement = 692,
         // The above items are available in M42 branch.
 
         ClientRectListItem = 694,
@@ -629,7 +626,6 @@
         V8Permissions_Query_Method = 750,
         // The above items are available in M43 branch.
 
-        WebkitCanvas = 753,
         V8HTMLInputElement_Autocapitalize_AttributeGetter = 754,
         V8HTMLInputElement_Autocapitalize_AttributeSetter = 755,
         V8HTMLTextAreaElement_Autocapitalize_AttributeGetter = 756,
@@ -662,12 +658,7 @@
         V8Screen_AvailLeft_AttributeGetter = 786,
         V8Screen_AvailTop_AttributeGetter = 787,
         ObjectObserve = 788,
-        V8SVGAnimationElement_HasExtension_Method = 789,
-        V8SVGCursorElement_HasExtension_Method = 790,
         V8SVGFEConvolveMatrixElement_PreserveAlpha_AttributeGetter = 791,
-        V8SVGGraphicsElement_HasExtension_Method = 795,
-        V8SVGMaskElement_HasExtension_Method = 796,
-        V8SVGPatternElement_HasExtension_Method = 797,
         V8SVGStyleElement_Disabled_AttributeGetter = 798,
         V8SVGStyleElement_Disabled_AttributeSetter = 799,
         ElementCreateShadowRootMultipleWithUserAgentShadowRoot = 800,
@@ -689,9 +680,6 @@
         V8DOMError_Name_AttributeGetter = 817,
         V8DOMError_Message_AttributeGetter = 818,
         V8FileReader_Error_AttributeGetter = 819,
-        V8IDBRequest_Error_AttributeGetter = 820,
-        V8IDBTransaction_Error_AttributeGetter = 821,
-        V8DOMStringList_Item_Method = 822,
         V8Location_AncestorOrigins_AttributeGetter = 823,
         V8IDBDatabase_ObjectStoreNames_AttributeGetter = 824,
         V8IDBObjectStore_IndexNames_AttributeGetter = 825,
diff --git a/third_party/WebKit/Source/core/html/HTMLDocument.h b/third_party/WebKit/Source/core/html/HTMLDocument.h
index 6ca7971..b7e42250 100644
--- a/third_party/WebKit/Source/core/html/HTMLDocument.h
+++ b/third_party/WebKit/Source/core/html/HTMLDocument.h
@@ -80,6 +80,8 @@
     void addItemToMap(HashCountedSet<AtomicString>&, const AtomicString&);
     void removeItemFromMap(HashCountedSet<AtomicString>&, const AtomicString&);
 
+    String debugName() const override { return "HTMLDocument"; }
+
     HashCountedSet<AtomicString> m_namedItemCounts;
     HashCountedSet<AtomicString> m_extraNamedItemCounts;
 };
diff --git a/third_party/WebKit/Source/core/html/HTMLImageLoader.h b/third_party/WebKit/Source/core/html/HTMLImageLoader.h
index 5852c73..141c40c 100644
--- a/third_party/WebKit/Source/core/html/HTMLImageLoader.h
+++ b/third_party/WebKit/Source/core/html/HTMLImageLoader.h
@@ -39,6 +39,7 @@
     void dispatchLoadEvent() override;
 
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "HTMLImageLoader"; }
 
 private:
     explicit HTMLImageLoader(Element*);
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.h b/third_party/WebKit/Source/core/html/HTMLLinkElement.h
index 096bdb5..ae550740 100644
--- a/third_party/WebKit/Source/core/html/HTMLLinkElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.h
@@ -87,6 +87,7 @@
 private:
     // From StyleSheetResourceClient
     void setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CSSStyleSheetResource*) override;
+    String debugName() const override { return "LinkStyle"; }
 
     enum DisabledState {
         Unset,
diff --git a/third_party/WebKit/Source/core/html/HTMLTrackElement.h b/third_party/WebKit/Source/core/html/HTMLTrackElement.h
index 4af6bfd6..e776b28 100644
--- a/third_party/WebKit/Source/core/html/HTMLTrackElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLTrackElement.h
@@ -72,6 +72,7 @@
     void newCuesAvailable(TextTrackLoader*) override;
     void cueLoadingCompleted(TextTrackLoader*, bool loadingFailed) override;
     void newRegionsAvailable(TextTrackLoader*) override;
+    String debugName() const override { return "HTMLTrackElement"; }
 
     void setReadyState(ReadyState);
 
diff --git a/third_party/WebKit/Source/core/html/HTMLViewSourceDocument.h b/third_party/WebKit/Source/core/html/HTMLViewSourceDocument.h
index b1c0dc21..cddaffd 100644
--- a/third_party/WebKit/Source/core/html/HTMLViewSourceDocument.h
+++ b/third_party/WebKit/Source/core/html/HTMLViewSourceDocument.h
@@ -75,6 +75,8 @@
     PassRefPtrWillBeRawPtr<Element> addLink(const AtomicString& url, bool isAnchor);
     PassRefPtrWillBeRawPtr<Element> addBase(const AtomicString& href);
 
+    String debugName() const override { return "HTMLViewSourceDocument"; }
+
     String m_type;
     RefPtrWillBeMember<Element> m_current;
     RefPtrWillBeMember<HTMLTableSectionElement> m_tbody;
diff --git a/third_party/WebKit/Source/core/html/ImageDocument.h b/third_party/WebKit/Source/core/html/ImageDocument.h
index 4599ac4..ad6c22b3 100644
--- a/third_party/WebKit/Source/core/html/ImageDocument.h
+++ b/third_party/WebKit/Source/core/html/ImageDocument.h
@@ -71,6 +71,8 @@
     bool shouldShrinkToFit() const;
     float scale() const;
 
+    String debugName() const override { return "ImageDocument"; }
+
     RefPtrWillBeMember<HTMLImageElement> m_imageElement;
 
     // Whether enough of the image has been loaded to determine its size
diff --git a/third_party/WebKit/Source/core/html/MediaDocument.h b/third_party/WebKit/Source/core/html/MediaDocument.h
index bfd0fb27..f762c52 100644
--- a/third_party/WebKit/Source/core/html/MediaDocument.h
+++ b/third_party/WebKit/Source/core/html/MediaDocument.h
@@ -43,6 +43,8 @@
     PassRefPtrWillBeRawPtr<DocumentParser> createParser() override;
 
     void defaultEventHandler(Event*) override;
+
+    String debugName() const override { return "MediaDocument"; }
 };
 
 }
diff --git a/third_party/WebKit/Source/core/html/PluginDocument.h b/third_party/WebKit/Source/core/html/PluginDocument.h
index ff772c6..f611709 100644
--- a/third_party/WebKit/Source/core/html/PluginDocument.h
+++ b/third_party/WebKit/Source/core/html/PluginDocument.h
@@ -54,6 +54,8 @@
 
     PassRefPtrWillBeRawPtr<DocumentParser> createParser() override;
 
+    String debugName() const override { return "PluginDocument"; }
+
     RefPtrWillBeMember<Node> m_pluginNode;
 };
 
diff --git a/third_party/WebKit/Source/core/html/TextDocument.h b/third_party/WebKit/Source/core/html/TextDocument.h
index 576c38bd..0eeab04 100644
--- a/third_party/WebKit/Source/core/html/TextDocument.h
+++ b/third_party/WebKit/Source/core/html/TextDocument.h
@@ -40,6 +40,8 @@
     TextDocument(const DocumentInit&);
 
     PassRefPtrWillBeRawPtr<DocumentParser> createParser() override;
+
+    String debugName() const override { return "TextDocument"; }
 };
 
 }
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h
index 83f24f7..bf92a7da 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h
@@ -104,6 +104,7 @@
     void responseReceived(Resource*, const ResourceResponse&, PassOwnPtr<WebDataConsumerHandle>) override;
     void dataReceived(Resource*, const char* data, unsigned length) override;
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "HTMLImportLoader"; }
 
     // DocumentParserClient
 
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.h b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.h
index fa4c50d..0de179e 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.h
+++ b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.h
@@ -64,6 +64,7 @@
 
     // ResourceClient
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "HTMLScriptRunner"; }
 
     DECLARE_TRACE();
 
diff --git a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
index 2c50c36..d0ebccf 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
@@ -21,6 +21,7 @@
 #include "core/css/CSSStyleRule.h"
 #include "core/css/resolver/StyleResolver.h"
 #include "core/dom/DOMNodeIds.h"
+#include "core/dom/NodeComputedStyle.h"
 #include "core/inspector/InjectedScriptManager.h"
 #include "core/inspector/InspectedFrames.h"
 #include "core/inspector/InspectorCSSAgent.h"
@@ -228,9 +229,9 @@
         Animation* clone = animationClone(animation);
         if (paused && !clone->paused()) {
             // Ensure we restore a current time if the animation is limited.
-            double currentTime = animation->timeline()->currentTime() - animation->startTime();
+            double currentTime = clone->timeline()->currentTime() - clone->startTime();
             clone->pause();
-            animation->setCurrentTime(currentTime);
+            clone->setCurrentTime(currentTime);
         } else if (!paused && clone->paused()) {
             clone->unpause();
         }
@@ -242,7 +243,32 @@
     const String id = String::number(animation->sequenceNumber());
     if (!m_idToAnimationClone.get(id)) {
         KeyframeEffect* oldEffect = toKeyframeEffect(animation->effect());
-        KeyframeEffect* newEffect = KeyframeEffect::create(oldEffect->target(), oldEffect->model(), oldEffect->specifiedTiming());
+        ASSERT(oldEffect->model()->isKeyframeEffectModel());
+        KeyframeEffectModelBase* oldModel = toKeyframeEffectModelBase(oldEffect->model());
+        EffectModel* newModel = nullptr;
+        // Clone EffectModel.
+        // TODO(samli): Determine if this is an animations bug.
+        if (oldModel->isStringKeyframeEffectModel()) {
+            StringKeyframeEffectModel* oldStringKeyframeModel = toStringKeyframeEffectModel(oldModel);
+            KeyframeVector oldKeyframes = oldStringKeyframeModel->getFrames();
+            StringKeyframeVector newKeyframes;
+            for (auto& oldKeyframe : oldKeyframes)
+                newKeyframes.append(toStringKeyframe(oldKeyframe.get()));
+            StringKeyframeEffectModel* newStringKeyframeModel = StringKeyframeEffectModel::create(newKeyframes);
+            // TODO(samli): This shouldn't be required.
+            Element* element = oldEffect->target();
+            newStringKeyframeModel->forceConversionsToAnimatableValues(*element, element->computedStyle());
+            newModel = newStringKeyframeModel;
+        } else if (oldModel->isAnimatableValueKeyframeEffectModel()) {
+            AnimatableValueKeyframeEffectModel* oldAnimatableValueKeyframeModel = toAnimatableValueKeyframeEffectModel(oldModel);
+            KeyframeVector oldKeyframes = oldAnimatableValueKeyframeModel->getFrames();
+            AnimatableValueKeyframeVector newKeyframes;
+            for (auto& oldKeyframe : oldKeyframes)
+                newKeyframes.append(toAnimatableValueKeyframe(oldKeyframe.get()));
+            newModel = AnimatableValueKeyframeEffectModel::create(newKeyframes);
+        }
+
+        KeyframeEffect* newEffect = KeyframeEffect::create(oldEffect->target(), newModel, oldEffect->specifiedTiming());
         m_isCloning = true;
         Animation* clone = Animation::create(newEffect, animation->timeline());
         m_isCloning = false;
@@ -250,13 +276,6 @@
         m_idToAnimation.set(String::number(clone->sequenceNumber()), clone);
         clone->play();
         clone->setStartTime(animation->startTime());
-
-        // TODO(samli): This shouldn't be necessary. The clone should override completely, but isn't, perhaps becaues the keyframe model is shared.
-        if (!animation->limited()) {
-            TrackExceptionState exceptionState;
-            animation->finish(exceptionState);
-            ASSERT(!exceptionState.hadException());
-        }
     }
     return m_idToAnimationClone.get(id);
 }
@@ -404,6 +423,11 @@
     frontend()->animationCreated(String::number(sequenceNumber));
 }
 
+void InspectorAnimationAgent::didCancelAnimation(unsigned sequenceNumber)
+{
+    frontend()->animationCanceled(String::number(sequenceNumber));
+}
+
 void InspectorAnimationAgent::didStartAnimation(Animation* animation)
 {
     const String& animationId = String::number(animation->sequenceNumber());
diff --git a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.h b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.h
index 31ad6a01..1062e1f 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.h
@@ -48,6 +48,7 @@
 
     // API for InspectorInstrumentation
     void didCreateAnimation(unsigned);
+    void didCancelAnimation(unsigned);
     void didStartAnimation(Animation*);
     void didClearDocumentOfWindowObject(LocalFrame*);
 
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
index 58349151..8bb736c 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
@@ -417,6 +417,9 @@
     void didCreateAnimation(Document*, unsigned);
 
     [Animation, Inline=FastReturn]
+    void didCancelAnimation(Document*, unsigned);
+
+    [Animation, Inline=FastReturn]
     void didStartAnimation(Document*, Animation* player);
 }
 
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp
index c9a9f038..11cf4a10 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp
@@ -44,6 +44,7 @@
 
     void setCSSStyleSheet(const String&, const KURL&, const String&, const CSSStyleSheetResource*) override;
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "InspectorResourceContentLoader::ResourceClient"; }
     void resourceFinished(Resource*);
 
     friend class InspectorResourceContentLoader;
diff --git a/third_party/WebKit/Source/core/layout/FloatingObjects.cpp b/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
index 3ce4b00..31694866 100644
--- a/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
+++ b/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
@@ -171,7 +171,7 @@
     // Clear references to originating lines, since the lines are being deleted
     FloatingObjectSetIterator end = m_set.end();
     for (FloatingObjectSetIterator it = m_set.begin(); it != end; ++it) {
-        ASSERT(!((*it)->originatingLine()) || (*it)->originatingLine()->layoutObject() == m_layoutObject);
+        ASSERT(!((*it)->originatingLine()) || (*it)->originatingLine()->lineLayoutItem().isEqual(m_layoutObject));
         (*it)->setOriginatingLine(nullptr);
     }
 }
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
index a2126f158..32c4ec8 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -940,7 +940,7 @@
                     }
 
                     if (oldFloatingObject->originatingLine() && !selfNeedsLayout()) {
-                        ASSERT(oldFloatingObject->originatingLine()->layoutObject() == this);
+                        ASSERT(oldFloatingObject->originatingLine()->lineLayoutItem().isEqual(this));
                         oldFloatingObject->originatingLine()->markDirty();
                     }
 
@@ -2255,7 +2255,7 @@
                 }
                 if (floatingObject.originatingLine()) {
                     if (!selfNeedsLayout()) {
-                        ASSERT(floatingObject.originatingLine()->layoutObject() == this);
+                        ASSERT(floatingObject.originatingLine()->lineLayoutItem().isEqual(this));
                         floatingObject.originatingLine()->markDirty();
                     }
 #if ENABLE(ASSERT)
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index 4319671..c246454 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -595,13 +595,28 @@
 
 LayoutUnit LayoutBox::constrainContentBoxLogicalHeightByMinMax(LayoutUnit logicalHeight, LayoutUnit intrinsicContentHeight) const
 {
+    // If the min/max height and logical height are both percentages we take advantage of already knowing the current resolved percentage height
+    // to avoid recursing up through our containing blocks again to determine it.
     const ComputedStyle& styleToUse = styleRef();
     if (!styleToUse.logicalMaxHeight().isMaxSizeNone()) {
-        LayoutUnit maxH = computeContentLogicalHeight(MaxSize, styleToUse.logicalMaxHeight(), intrinsicContentHeight);
-        if (maxH != -1)
-            logicalHeight = std::min(logicalHeight, maxH);
+        if (styleToUse.logicalMaxHeight().hasPercent() && styleToUse.logicalHeight().hasPercent()) {
+            LayoutUnit availableLogicalHeight = logicalHeight / styleToUse.logicalHeight().value() * 100;
+            logicalHeight = std::min(logicalHeight, valueForLength(styleToUse.logicalMaxHeight(), availableLogicalHeight));
+        } else {
+            LayoutUnit maxHeight = computeContentLogicalHeight(MaxSize, styleToUse.logicalMaxHeight(), -1);
+            if (maxHeight != -1)
+                logicalHeight = std::min(logicalHeight, maxHeight);
+        }
     }
-    return std::max(logicalHeight, computeContentLogicalHeight(MinSize, styleToUse.logicalMinHeight(), intrinsicContentHeight));
+
+    if (styleToUse.logicalMinHeight().hasPercent() && styleToUse.logicalHeight().hasPercent()) {
+        LayoutUnit availableLogicalHeight = logicalHeight / styleToUse.logicalHeight().value() * 100;
+        logicalHeight = std::max(logicalHeight, valueForLength(styleToUse.logicalMinHeight(), availableLogicalHeight));
+    } else {
+        logicalHeight = std::max(logicalHeight, computeContentLogicalHeight(MinSize, styleToUse.logicalMinHeight(), intrinsicContentHeight));
+    }
+
+    return logicalHeight;
 }
 
 void LayoutBox::setLocationAndUpdateOverflowControlsIfNeeded(const LayoutPoint& location)
@@ -2852,7 +2867,11 @@
     if (hasOverrideContainingBlockLogicalWidth())
         return overrideContainingBlockContentLogicalWidth();
 
-    if (containingBlock->isBox())
+    // Ensure we compute our width based on the width of our rel-pos inline container rather than any anonymous block
+    // created to manage a block-flow ancestor of ours in the rel-pos inline's inline flow.
+    if (containingBlock->isAnonymousBlock() && containingBlock->isRelPositioned())
+        containingBlock = toLayoutBox(containingBlock)->continuation();
+    else if (containingBlock->isBox())
         return std::max(LayoutUnit(), toLayoutBox(containingBlock)->clientLogicalWidth());
 
     ASSERT(containingBlock->isLayoutInline() && containingBlock->isInFlowPositioned());
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h
index d61344e..1ec4cab 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -454,6 +454,8 @@
         const ComputedStyle* styleToUse = overrideStyle ? overrideStyle : style();
         return m_marginBoxOutsets.end(styleToUse->writingMode(), styleToUse->direction());
     }
+    LayoutUnit marginOver() const final { return m_marginBoxOutsets.over(style()->writingMode()); }
+    LayoutUnit marginUnder() const final { return m_marginBoxOutsets.under(style()->writingMode()); }
     void setMarginBefore(LayoutUnit value, const ComputedStyle* overrideStyle = nullptr) { m_marginBoxOutsets.setBefore((overrideStyle ? overrideStyle : style())->writingMode(), value); }
     void setMarginAfter(LayoutUnit value, const ComputedStyle* overrideStyle = nullptr) { m_marginBoxOutsets.setAfter((overrideStyle ? overrideStyle : style())->writingMode(), value); }
     void setMarginStart(LayoutUnit value, const ComputedStyle* overrideStyle = nullptr)
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
index a59d3e7..14089365 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
@@ -184,6 +184,8 @@
     LayoutUnit computedCSSPaddingAfter() const { return computedCSSPadding(style()->paddingAfter()); }
     LayoutUnit computedCSSPaddingStart() const { return computedCSSPadding(style()->paddingStart()); }
     LayoutUnit computedCSSPaddingEnd() const { return computedCSSPadding(style()->paddingEnd()); }
+    LayoutUnit computedCSSPaddingOver() const { return computedCSSPadding(style()->paddingOver()); }
+    LayoutUnit computedCSSPaddingUnder() const { return computedCSSPadding(style()->paddingUnder()); }
 
     // These functions are used during layout.
     // - Table cells override them to include the intrinsic padding (see
@@ -197,6 +199,8 @@
     virtual LayoutUnit paddingAfter() const { return computedCSSPaddingAfter(); }
     virtual LayoutUnit paddingStart() const { return computedCSSPaddingStart(); }
     virtual LayoutUnit paddingEnd() const { return computedCSSPaddingEnd(); }
+    LayoutUnit paddingOver() const { return computedCSSPaddingOver(); }
+    LayoutUnit paddingUnder() const { return computedCSSPaddingUnder(); }
 
     virtual int borderTop() const { return style()->borderTopWidth(); }
     virtual int borderBottom() const { return style()->borderBottomWidth(); }
@@ -206,6 +210,8 @@
     virtual int borderAfter() const { return style()->borderAfterWidth(); }
     virtual int borderStart() const { return style()->borderStartWidth(); }
     virtual int borderEnd() const { return style()->borderEndWidth(); }
+    int borderOver() const { return style()->borderOverWidth(); }
+    int borderUnder() const { return style()->borderUnderWidth(); }
 
     int borderWidth() const { return borderLeft() + borderRight(); }
     int borderHeight() const { return borderTop() + borderBottom(); }
@@ -218,6 +224,8 @@
     LayoutUnit borderAndPaddingStart() const { return borderStart() + paddingStart(); }
     LayoutUnit borderAndPaddingBefore() const { return borderBefore() + paddingBefore(); }
     LayoutUnit borderAndPaddingAfter() const { return borderAfter() + paddingAfter(); }
+    LayoutUnit borderAndPaddingOver() const { return borderOver() + paddingOver(); }
+    LayoutUnit borderAndPaddingUnder() const { return borderUnder() + paddingUnder(); }
 
     LayoutUnit borderAndPaddingHeight() const { return borderTop() + borderBottom() + paddingTop() + paddingBottom(); }
     LayoutUnit borderAndPaddingWidth() const { return borderLeft() + borderRight() + paddingLeft() + paddingRight(); }
@@ -239,6 +247,8 @@
     virtual LayoutUnit marginAfter(const ComputedStyle* otherStyle = nullptr) const = 0;
     virtual LayoutUnit marginStart(const ComputedStyle* otherStyle = nullptr) const = 0;
     virtual LayoutUnit marginEnd(const ComputedStyle* otherStyle = nullptr) const = 0;
+    virtual LayoutUnit marginOver() const = 0;
+    virtual LayoutUnit marginUnder() const = 0;
     LayoutUnit marginHeight() const { return marginTop() + marginBottom(); }
     LayoutUnit marginWidth() const { return marginLeft() + marginRight(); }
     LayoutUnit marginLogicalHeight() const { return marginBefore() + marginAfter(); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index bd5b96d..fc6ed437 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -473,8 +473,7 @@
         for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) {
             GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]);
             while (LayoutBox* gridItem = iterator.nextGridItem()) {
-                const GridCoordinate coordinate = cachedGridCoordinate(*gridItem);
-                const GridSpan span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
+                const GridSpan span = cachedGridSpan(*gridItem, direction);
 
                 // Do not include already processed items.
                 if (i > 0 && span.resolvedInitialPosition.toInt() <= flexibleSizedTracksIndex[i - 1])
@@ -689,39 +688,32 @@
     return logicalHeightForChild(child, columnTracks);
 }
 
-// We're basically using a class instead of a std::pair for two reasons. First of all, accessing gridItem() or
-// coordinate() is much more self-explanatory that using .first or .second members in the pair. Secondly the class
-// allows us to precompute the value of the span, something which is quite convenient for the sorting. Having a
-// std::pair<LayoutBox*, size_t> does not work either because we still need the GridCoordinate so we'd have to add an
-// extra hash lookup for each item at the beginning of LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems().
+// We're basically using a class instead of a std::pair because of accessing gridItem() or gridSpan() is much more
+// self-explanatory that using .first or .second members in the pair. Having a std::pair<LayoutBox*, size_t>
+// does not work either because we still need the GridSpan so we'd have to add an extra hash lookup for each item
+// at the beginning of LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems().
 class GridItemWithSpan {
 public:
-    GridItemWithSpan(LayoutBox& gridItem, const GridCoordinate& coordinate, GridTrackSizingDirection direction)
+    GridItemWithSpan(LayoutBox& gridItem, const GridSpan& gridSpan)
         : m_gridItem(&gridItem)
-        , m_coordinate(coordinate)
+        , m_gridSpan(gridSpan)
     {
-        const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordinate.columns;
-        m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPosition.toInt() + 1;
     }
 
     LayoutBox& gridItem() const { return *m_gridItem; }
-    GridCoordinate coordinate() const { return m_coordinate; }
-#if ENABLE(ASSERT)
-    size_t span() const { return m_span; }
-#endif
+    GridSpan gridSpan() const { return m_gridSpan; }
 
-    bool operator<(const GridItemWithSpan other) const { return m_span < other.m_span; }
+    bool operator<(const GridItemWithSpan other) const { return m_gridSpan.integerSpan() < other.m_gridSpan.integerSpan(); }
 
 private:
     LayoutBox* m_gridItem;
-    GridCoordinate m_coordinate;
-    size_t m_span;
+    GridSpan m_gridSpan;
 };
 
-bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridCoordinate& coordinate, GridTrackSizingDirection direction) const
+bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction) const
 {
-    const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
-    const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition;
+    const GridResolvedPosition initialTrackPosition = span.resolvedInitialPosition;
+    const GridResolvedPosition finalTrackPosition = span.resolvedFinalPosition;
 
     for (GridResolvedPosition trackPosition = initialTrackPosition; trackPosition <= finalTrackPosition; ++trackPosition) {
         const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition.toInt());
@@ -732,11 +724,6 @@
     return false;
 }
 
-static inline size_t integerSpanForDirection(const GridCoordinate& coordinate, GridTrackSizingDirection direction)
-{
-    return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.columns.integerSpan();
-}
-
 void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection direction, GridSizingData& sizingData)
 {
     sizingData.itemsSortedByIncreasingSpan.shrink(0);
@@ -746,11 +733,11 @@
         GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex];
         while (LayoutBox* gridItem = iterator.nextGridItem()) {
             if (itemsSet.add(gridItem).isNewEntry) {
-                const GridCoordinate& coordinate = cachedGridCoordinate(*gridItem);
-                if (integerSpanForDirection(coordinate, direction) == 1) {
-                    resolveContentBasedTrackSizingFunctionsForNonSpanningItems(direction, coordinate, *gridItem, track, sizingData.columnTracks);
-                } else if (!spanningItemCrossesFlexibleSizedTracks(coordinate, direction)) {
-                    sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, coordinate, direction));
+                const GridSpan& span = cachedGridSpan(*gridItem, direction);
+                if (span.integerSpan() == 1) {
+                    resolveContentBasedTrackSizingFunctionsForNonSpanningItems(direction, span, *gridItem, track, sizingData.columnTracks);
+                } else if (!spanningItemCrossesFlexibleSizedTracks(span, direction)) {
+                    sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
                 }
             }
         }
@@ -776,9 +763,9 @@
     }
 }
 
-void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridCoordinate& coordinate, LayoutBox& gridItem, GridTrack& track, Vector<GridTrack>& columnTracks)
+void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridTrack& track, Vector<GridTrack>& columnTracks)
 {
-    const GridResolvedPosition trackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
+    const GridResolvedPosition trackPosition = span.resolvedInitialPosition;
     GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt());
 
     if (trackSize.hasMinContentMinTrackBreadth())
@@ -930,9 +917,8 @@
 
     for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEnd; ++it) {
         GridItemWithSpan& gridItemWithSpan = *it;
-        ASSERT(gridItemWithSpan.span() > 1);
-        const GridCoordinate coordinate = gridItemWithSpan.coordinate();
-        const GridSpan& itemSpan = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
+        ASSERT(gridItemWithSpan.gridSpan().integerSpan() > 1);
+        const GridSpan& itemSpan = gridItemWithSpan.gridSpan();
 
         sizingData.growBeyondGrowthLimitsTracks.shrink(0);
         sizingData.filteredTracks.shrink(0);
@@ -1496,10 +1482,15 @@
     return m_gridItemCoordinate.get(&gridItem);
 }
 
+GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDirection direction) const
+{
+    GridCoordinate coordinate = cachedGridCoordinate(gridItem);
+    return direction == ForColumns ? coordinate.columns : coordinate.rows;
+}
+
 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrackSizingDirection direction, const Vector<GridTrack>& tracks) const
 {
-    const GridCoordinate& coordinate = cachedGridCoordinate(child);
-    const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
+    const GridSpan& span = cachedGridSpan(child, direction);
     LayoutUnit gridAreaBreadth = 0;
     for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span.end(); ++trackPosition)
         gridAreaBreadth += tracks[trackPosition.toInt()].baseSize();
@@ -1514,8 +1505,7 @@
     // We need the cached value when available because Content Distribution alignment properties
     // may have some influence in the final grid area breadth.
     const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
-    const GridCoordinate& coordinate = cachedGridCoordinate(child);
-    const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
+    const GridSpan& span = cachedGridSpan(child, direction);
     const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_columnPositions : m_rowPositions;
     LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition.toInt()];
     LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.toInt()];
@@ -1826,8 +1816,8 @@
 
 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const
 {
-    const GridCoordinate& coordinate = cachedGridCoordinate(child);
-    size_t childStartLine = coordinate.rows.resolvedInitialPosition.toInt();
+    const GridSpan& rowsSpan = cachedGridSpan(child, ForRows);
+    size_t childStartLine = rowsSpan.resolvedInitialPosition.toInt();
     LayoutUnit startOfRow = m_rowPositions[childStartLine];
     LayoutUnit startPosition = startOfRow + marginBeforeForChild(child);
     if (hasAutoMarginsInColumnAxis(child))
@@ -1838,7 +1828,7 @@
         return startPosition;
     case GridAxisEnd:
     case GridAxisCenter: {
-        size_t childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt();
+        size_t childEndLine = rowsSpan.resolvedFinalPosition.next().toInt();
         LayoutUnit endOfRow = m_rowPositions[childEndLine];
         // m_rowPositions include gutters so we need to substract them to get the actual end position for a given
         // row (this does not have to be done for the last track as there are no more m_rowPositions after it)
@@ -1858,8 +1848,8 @@
 
 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const
 {
-    const GridCoordinate& coordinate = cachedGridCoordinate(child);
-    size_t childStartLine = coordinate.columns.resolvedInitialPosition.toInt();
+    const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns);
+    size_t childStartLine = columnsSpan.resolvedInitialPosition.toInt();
     LayoutUnit startOfColumn = m_columnPositions[childStartLine];
     LayoutUnit startPosition = startOfColumn + marginStartForChild(child);
     if (hasAutoMarginsInRowAxis(child))
@@ -1870,7 +1860,7 @@
         return startPosition;
     case GridAxisEnd:
     case GridAxisCenter: {
-        size_t childEndLine = coordinate.columns.resolvedFinalPosition.next().toInt();
+        size_t childEndLine = columnsSpan.resolvedFinalPosition.next().toInt();
         LayoutUnit endOfColumn = m_columnPositions[childEndLine];
         // m_columnPositions include gutters so we need to substract them to get the actual end position for a given
         // column (this does not have to be done for the last track as there are no more m_columnPositions after it)
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.h b/third_party/WebKit/Source/core/layout/LayoutGrid.h
index c9cc024..96a4f55e 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.h
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.h
@@ -132,7 +132,7 @@
 
     typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
     LayoutUnit currentItemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase, LayoutBox&, GridTrackSizingDirection, Vector<GridTrack>& columnTracks);
-    void resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection, const GridCoordinate&, LayoutBox& gridItem, GridTrack&, Vector<GridTrack>& columnTracks);
+    void resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection, const GridSpan&, LayoutBox& gridItem, GridTrack&, Vector<GridTrack>& columnTracks);
     template <TrackSizeComputationPhase> void resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection, GridSizingData&, const GridItemsSpanGroupRange&);
     template <TrackSizeComputationPhase> void distributeSpaceToTracks(Vector<GridTrack*>&, const Vector<GridTrack*>* growBeyondGrowthLimitsTracks, GridSizingData&, LayoutUnit& availableLogicalSpace);
 
@@ -153,6 +153,7 @@
     ContentAlignmentData computeContentPositionAndDistributionOffset(GridTrackSizingDirection, const LayoutUnit& availableFreeSpace, unsigned numberOfGridTracks) const;
     LayoutPoint findChildLogicalPosition(const LayoutBox&, GridSizingData&) const;
     GridCoordinate cachedGridCoordinate(const LayoutBox&) const;
+    GridSpan cachedGridSpan(const LayoutBox&, GridTrackSizingDirection) const;
 
     LayoutUnit gridAreaBreadthForChild(const LayoutBox& child, GridTrackSizingDirection, const Vector<GridTrack>&) const;
     LayoutUnit gridAreaBreadthForChildIncludingAlignmentOffsets(const LayoutBox&, GridTrackSizingDirection, const GridSizingData&) const;
@@ -179,7 +180,7 @@
 #endif
 
     size_t gridItemSpan(const LayoutBox&, GridTrackSizingDirection);
-    bool spanningItemCrossesFlexibleSizedTracks(const GridCoordinate&, GridTrackSizingDirection) const;
+    bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&, GridTrackSizingDirection) const;
 
     size_t gridColumnCount() const
     {
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
index 5c281878..11eb3d2e 100644
--- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
@@ -748,6 +748,16 @@
     return computeMargin(this, style()->marginAfterUsing(otherStyle ? otherStyle : style()));
 }
 
+LayoutUnit LayoutInline::marginOver() const
+{
+    return computeMargin(this, style()->marginOver());
+}
+
+LayoutUnit LayoutInline::marginUnder() const
+{
+    return computeMargin(this, style()->marginUnder());
+}
+
 bool LayoutInline::nodeAtPoint(HitTestResult& result,
     const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
 {
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.h b/third_party/WebKit/Source/core/layout/LayoutInline.h
index 945a4f5..ff0ca351 100644
--- a/third_party/WebKit/Source/core/layout/LayoutInline.h
+++ b/third_party/WebKit/Source/core/layout/LayoutInline.h
@@ -134,6 +134,8 @@
     LayoutUnit marginAfter(const ComputedStyle* otherStyle = nullptr) const final;
     LayoutUnit marginStart(const ComputedStyle* otherStyle = nullptr) const final;
     LayoutUnit marginEnd(const ComputedStyle* otherStyle = nullptr) const final;
+    LayoutUnit marginOver() const final;
+    LayoutUnit marginUnder() const final;
 
     void absoluteRects(Vector<IntRect>&, const LayoutPoint& accumulatedOffset) const final;
     void absoluteQuads(Vector<FloatQuad>&, bool* wasFixed) const override;
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index da275bcd..6b76d49 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -221,7 +221,7 @@
     String decoratedName() const;
 
     // Returns the decorated name along with the debug information from the associated Node object.
-    String debugName() const;
+    String debugName() const final;
 
     LayoutObject* parent() const { return m_parent; }
     bool isDescendantOf(const LayoutObject*) const;
diff --git a/third_party/WebKit/Source/core/layout/LayoutText.cpp b/third_party/WebKit/Source/core/layout/LayoutText.cpp
index 10b8909..98306bb 100644
--- a/third_party/WebKit/Source/core/layout/LayoutText.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutText.cpp
@@ -1845,7 +1845,7 @@
 #ifdef CHECK_CONSISTENCY
     const InlineTextBox* prev = nullptr;
     for (const InlineTextBox* child = m_firstTextBox; child; child = child->nextTextBox()) {
-        ASSERT(child->layoutObject() == this);
+        ASSERT(child->lineLayoutItem().isEqual(this));
         ASSERT(child->prevTextBox() == prev);
         prev = child;
     }
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutBoxModel.h b/third_party/WebKit/Source/core/layout/api/LineLayoutBoxModel.h
index d088a56..959294b 100644
--- a/third_party/WebKit/Source/core/layout/api/LineLayoutBoxModel.h
+++ b/third_party/WebKit/Source/core/layout/api/LineLayoutBoxModel.h
@@ -78,6 +78,16 @@
         return toBoxModel()->marginAfter(otherStyle);
     }
 
+    LayoutUnit marginOver() const
+    {
+        return toBoxModel()->marginOver();
+    }
+
+    LayoutUnit marginUnder() const
+    {
+        return toBoxModel()->marginUnder();
+    }
+
     LayoutUnit paddingTop() const
     {
         return toBoxModel()->paddingTop();
@@ -148,6 +158,16 @@
         return toBoxModel()->hasInlineDirectionBordersOrPadding();
     }
 
+    LayoutUnit borderAndPaddingOver() const
+    {
+        return toBoxModel()->borderAndPaddingOver();
+    }
+
+    LayoutUnit borderAndPaddingUnder() const
+    {
+        return toBoxModel()->borderAndPaddingUnder();
+    }
+
     LayoutUnit borderAndPaddingLogicalHeight() const
     {
         return toBoxModel()->borderAndPaddingLogicalHeight();
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h
index befda59d..760b76f5 100644
--- a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h
+++ b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h
@@ -44,6 +44,11 @@
     // https://crbug.com/499321
     operator LayoutObject*() const { return m_layoutObject; }
 
+    bool isEqual(const LayoutObject* layoutObject) const
+    {
+        return m_layoutObject == layoutObject;
+    }
+
     bool needsLayout() const
     {
         return m_layoutObject->needsLayout();
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index 9d3e9d96..b8440dc0 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -202,7 +202,7 @@
     updateForegroundLayer(false);
     updateBackgroundLayer(false);
     updateMaskLayer(false);
-    updateClippingMaskLayers(false);
+    updateChildClippingMaskLayer(false);
     updateScrollingLayers(false);
     updateSquashingLayers(false);
     destroyGraphicsLayers();
@@ -468,30 +468,49 @@
     // that's plugged into another GraphicsLayer that is part of the hierarchy.
     // It has no parent or child GraphicsLayer. For that reason, we process it
     // here, after the hierarchy has been updated.
-    bool maskLayerChanged = false;
-    if (updateMaskLayer(layoutObject->hasMask())) {
-        maskLayerChanged = true;
+    bool maskLayerChanged = updateMaskLayer(layoutObject->hasMask());
+    if (maskLayerChanged)
         m_graphicsLayer->setMaskLayer(m_maskLayer.get());
-    }
 
     bool hasChildClippingLayer = compositor->clipsCompositingDescendants(&m_owningLayer) && (hasClippingLayer() || hasScrollingLayer());
     // If we have a border radius or clip path on a scrolling layer, we need a clipping mask to properly
     // clip the scrolled contents, even if there are no composited descendants.
     bool hasClipPath = layoutObject->style()->clipPath();
     bool needsChildClippingMask = (hasClipPath || layoutObject->style()->hasBorderRadius()) && (hasChildClippingLayer || isAcceleratedContents(layoutObject) || hasScrollingLayer());
-    if (updateClippingMaskLayers(needsChildClippingMask)) {
-        // Clip path clips the entire subtree, including scrollbars. It must be attached directly onto
-        // the main m_graphicsLayer.
-        if (hasClipPath)
-            m_graphicsLayer->setMaskLayer(m_childClippingMaskLayer.get());
-        else if (hasClippingLayer())
-            clippingLayer()->setMaskLayer(m_childClippingMaskLayer.get());
-        else if (hasScrollingLayer())
-            scrollingLayer()->setMaskLayer(m_childClippingMaskLayer.get());
-        else if (isAcceleratedContents(layoutObject))
-            m_graphicsLayer->setContentsClippingMaskLayer(m_childClippingMaskLayer.get());
+
+    GraphicsLayer* layerToApplyChildClippingMask = nullptr;
+    bool shouldApplyChildClippingMaskOnContents = false;
+    if (needsChildClippingMask) {
+        if (hasClipPath) {
+            // Clip path clips the entire subtree, including scrollbars. It must be attached directly onto
+            // the main m_graphicsLayer.
+            layerToApplyChildClippingMask = m_graphicsLayer.get();
+        } else if (hasClippingLayer()) {
+            layerToApplyChildClippingMask = clippingLayer();
+        } else if (hasScrollingLayer()) {
+            layerToApplyChildClippingMask = scrollingLayer();
+        } else if (isAcceleratedContents(layoutObject)) {
+            shouldApplyChildClippingMaskOnContents = true;
+        }
     }
 
+    updateChildClippingMaskLayer(needsChildClippingMask);
+
+    if (layerToApplyChildClippingMask == m_graphicsLayer) {
+        if (m_graphicsLayer->maskLayer() != m_childClippingMaskLayer.get()) {
+            m_graphicsLayer->setMaskLayer(m_childClippingMaskLayer.get());
+            maskLayerChanged = true;
+        }
+    } else if (m_graphicsLayer->maskLayer() && m_graphicsLayer->maskLayer() != m_maskLayer.get()) {
+        m_graphicsLayer->setMaskLayer(nullptr);
+        maskLayerChanged = true;
+    }
+    if (hasClippingLayer())
+        clippingLayer()->setMaskLayer(layerToApplyChildClippingMask == clippingLayer() ? m_childClippingMaskLayer.get() : nullptr);
+    if (hasScrollingLayer())
+        scrollingLayer()->setMaskLayer(layerToApplyChildClippingMask == scrollingLayer() ? m_childClippingMaskLayer.get() : nullptr);
+    m_graphicsLayer->setContentsClippingMaskLayer(shouldApplyChildClippingMaskOnContents ? m_childClippingMaskLayer.get() : nullptr);
+
     if (m_owningLayer.reflectionInfo()) {
         if (m_owningLayer.reflectionInfo()->reflectionLayer()->hasCompositedLayerMapping()) {
             GraphicsLayer* reflectionLayer = m_owningLayer.reflectionInfo()->reflectionLayer()->compositedLayerMapping()->mainGraphicsLayer();
@@ -1546,20 +1565,16 @@
     return layerChanged;
 }
 
-bool CompositedLayerMapping::updateClippingMaskLayers(bool needsChildClippingMaskLayer)
+void CompositedLayerMapping::updateChildClippingMaskLayer(bool needsChildClippingMaskLayer)
 {
-    bool layerChanged = false;
     if (needsChildClippingMaskLayer) {
         if (!m_childClippingMaskLayer) {
             m_childClippingMaskLayer = createGraphicsLayer(CompositingReasonLayerForClippingMask);
             m_childClippingMaskLayer->setPaintingPhase(GraphicsLayerPaintChildClippingMask);
-            layerChanged = true;
         }
-    } else if (m_childClippingMaskLayer) {
-        m_childClippingMaskLayer = nullptr;
-        layerChanged = true;
+        return;
     }
-    return layerChanged;
+    m_childClippingMaskLayer = nullptr;
 }
 
 bool CompositedLayerMapping::updateScrollingLayers(bool needsScrollingLayers)
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.h b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.h
index e296052e..a479f84d 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.h
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.h
@@ -250,7 +250,7 @@
     bool updateForegroundLayer(bool needsForegroundLayer);
     bool updateBackgroundLayer(bool needsBackgroundLayer);
     bool updateMaskLayer(bool needsMaskLayer);
-    bool updateClippingMaskLayers(bool needsChildClippingMaskLayer);
+    void updateChildClippingMaskLayer(bool needsChildClippingMaskLayer);
     bool requiresHorizontalScrollbarLayer() const { return m_owningLayer.scrollableArea() && m_owningLayer.scrollableArea()->horizontalScrollbar(); }
     bool requiresVerticalScrollbarLayer() const { return m_owningLayer.scrollableArea() && m_owningLayer.scrollableArea()->verticalScrollbar(); }
     bool requiresScrollCornerLayer() const { return m_owningLayer.scrollableArea() && !m_owningLayer.scrollableArea()->scrollCornerAndResizerRect().isEmpty(); }
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
index 34b8fa8..0490a8a6 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
@@ -208,6 +208,39 @@
     EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 4001, 4001), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
 }
 
+TEST_F(CompositedLayerMappingTest, ClippingMaskLayer)
+{
+    if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+        return;
+
+    const AtomicString styleWithoutClipping = "backface-visibility: hidden; width: 200px; height: 200px";
+    const AtomicString styleWithBorderRadius = styleWithoutClipping + "; border-radius: 10px";
+    const AtomicString styleWithClipPath = styleWithoutClipping + "; -webkit-clip-path: inset(10px)";
+
+    setBodyInnerHTML("<video id='video' src='x' style='" + styleWithoutClipping + "'></video>");
+
+    document().view()->updateAllLifecyclePhases();
+    Element* videoElement = document().getElementById("video");
+    GraphicsLayer* graphicsLayer = toLayoutBoxModelObject(videoElement->layoutObject())->layer()->graphicsLayerBacking();
+    EXPECT_FALSE(graphicsLayer->maskLayer());
+    EXPECT_FALSE(graphicsLayer->contentsClippingMaskLayer());
+
+    videoElement->setAttribute(HTMLNames::styleAttr, styleWithBorderRadius);
+    document().view()->updateAllLifecyclePhases();
+    EXPECT_FALSE(graphicsLayer->maskLayer());
+    EXPECT_TRUE(graphicsLayer->contentsClippingMaskLayer());
+
+    videoElement->setAttribute(HTMLNames::styleAttr, styleWithClipPath);
+    document().view()->updateAllLifecyclePhases();
+    EXPECT_TRUE(graphicsLayer->maskLayer());
+    EXPECT_FALSE(graphicsLayer->contentsClippingMaskLayer());
+
+    videoElement->setAttribute(HTMLNames::styleAttr, styleWithoutClipping);
+    document().view()->updateAllLifecyclePhases();
+    EXPECT_FALSE(graphicsLayer->maskLayer());
+    EXPECT_FALSE(graphicsLayer->contentsClippingMaskLayer());
+}
+
 TEST_F(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintEmpty)
 {
     IntSize layerSize(1000, 1000);
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
index 60bd3291..aa46e439 100644
--- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -804,7 +804,7 @@
 {
     IntRect defaultClip;
     if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled() && !clip) {
-        defaultClip.setSize(expandedIntSize(graphicsLayer->size()));
+        defaultClip.setSize(m_layoutView.layoutSize(IncludeScrollbars));
         clip = &defaultClip;
     }
     ASSERT(clip);
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
index f8a1ff7..6d44020 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
+++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
@@ -590,7 +590,7 @@
     if (descendantsHaveSameLineHeightAndBaseline()) {
         adjustmentForChildrenWithSameLineHeightAndBaseline = logicalTop();
         if (parent())
-            adjustmentForChildrenWithSameLineHeightAndBaseline += (boxModelObject().borderBefore() + boxModelObject().paddingBefore());
+            adjustmentForChildrenWithSameLineHeightAndBaseline += boxModelObject().borderAndPaddingOver();
     }
 
     for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) {
@@ -626,14 +626,15 @@
             newLogicalTop += curr->baselinePosition(baselineType) - fontMetrics.ascent(baselineType);
             if (curr->isInlineFlowBox()) {
                 LineLayoutBoxModel boxObject = LineLayoutBoxModel(curr->lineLayoutItem());
-                newLogicalTop -= boxObject.style(isFirstLineStyle())->isHorizontalWritingMode() ? boxObject.borderTop() + boxObject.paddingTop() :
-                    boxObject.borderRight() + boxObject.paddingRight();
+                newLogicalTop -= boxObject.borderAndPaddingOver();
                 borderPaddingHeight = boxObject.borderAndPaddingLogicalHeight();
             }
             newLogicalTopIncludingMargins = newLogicalTop;
         } else if (!curr->layoutObject().isBR()) {
             LineLayoutBox box = LineLayoutBox(curr->lineLayoutItem());
             newLogicalTopIncludingMargins = newLogicalTop;
+            // TODO(kojii): isHorizontal() does not match to m_layoutObject.isHorizontalWritingMode(). crbug.com/552954
+            // ASSERT(curr->isHorizontal() == curr->layoutObject().style()->isHorizontalWritingMode());
             LayoutUnit overSideMargin = curr->isHorizontal() ? box.marginTop() : box.marginRight();
             LayoutUnit underSideMargin = curr->isHorizontal() ? box.marginBottom() : box.marginLeft();
             newLogicalTop += overSideMargin;
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoadTiming.cpp b/third_party/WebKit/Source/core/loader/DocumentLoadTiming.cpp
index 0113356..e16b057c 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoadTiming.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentLoadTiming.cpp
@@ -58,6 +58,11 @@
     visitor->trace(m_documentLoader);
 }
 
+LocalFrame* DocumentLoadTiming::frame() const
+{
+    return m_documentLoader ? m_documentLoader->frame() : nullptr;
+}
+
 void DocumentLoadTiming::notifyDocumentTimingChanged()
 {
     if (m_documentLoader)
@@ -93,18 +98,18 @@
         ASSERT(m_referenceMonotonicTime && m_referenceWallTime);
         return;
     }
-    TRACE_EVENT_MARK("blink.user_timing", "navigationStart");
     ASSERT(!m_navigationStart && !m_referenceMonotonicTime && !m_referenceWallTime);
 
     m_navigationStart = m_referenceMonotonicTime = monotonicallyIncreasingTime();
     m_referenceWallTime = currentTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "navigationStart", m_navigationStart, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::setNavigationStart(double navigationStart)
 {
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "navigationStart", navigationStart);
     m_navigationStart = navigationStart;
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "navigationStart", m_navigationStart, "frame", frame());
 
     // |m_referenceMonotonicTime| and |m_referenceWallTime| represent
     // navigationStart. When the embedder sets navigationStart (because the
@@ -134,57 +139,57 @@
 
 void DocumentLoadTiming::markUnloadEventStart()
 {
-    TRACE_EVENT_MARK("blink.user_timing", "unloadEventStart");
     m_unloadEventStart = monotonicallyIncreasingTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "unloadEventStart", m_unloadEventStart, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::markUnloadEventEnd()
 {
-    TRACE_EVENT_MARK("blink.user_timing", "unloadEventEnd");
     m_unloadEventEnd = monotonicallyIncreasingTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "unloadEventEnd", m_unloadEventEnd, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::markFetchStart()
 {
-    TRACE_EVENT_MARK("blink.user_timing", "fetchStart");
     m_fetchStart = monotonicallyIncreasingTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "fetchStart", m_fetchStart, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::setResponseEnd(double responseEnd)
 {
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "responseEnd", responseEnd);
     m_responseEnd = responseEnd;
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "responseEnd", m_responseEnd, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::markLoadEventStart()
 {
-    TRACE_EVENT_MARK("blink.user_timing", "loadEventStart");
     m_loadEventStart = monotonicallyIncreasingTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "loadEventStart", m_loadEventStart, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::markLoadEventEnd()
 {
-    TRACE_EVENT_MARK("blink.user_timing", "loadEventEnd");
     m_loadEventEnd = monotonicallyIncreasingTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "loadEventEnd", m_loadEventEnd, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::setRedirectStart(double redirectStart)
 {
-    TRACE_EVENT_MARK_WITH_TIMESTAMP("blink.user_timing", "redirectStart", redirectStart);
-    m_redirectStart = m_fetchStart;
+    m_redirectStart = redirectStart;
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "redirectStart", m_redirectStart, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
 void DocumentLoadTiming::markRedirectEnd()
 {
-    TRACE_EVENT_MARK("blink.user_timing", "redirectEnd");
     m_redirectEnd = monotonicallyIncreasingTime();
+    TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing", "redirectEnd", m_redirectEnd, "frame", frame());
     notifyDocumentTimingChanged();
 }
 
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoadTiming.h b/third_party/WebKit/Source/core/loader/DocumentLoadTiming.h
index 8c47eb21c..f3e6aeb 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoadTiming.h
+++ b/third_party/WebKit/Source/core/loader/DocumentLoadTiming.h
@@ -34,6 +34,7 @@
 
 class DocumentLoader;
 class KURL;
+class LocalFrame;
 
 class CORE_EXPORT DocumentLoadTiming final {
     DISALLOW_NEW();
@@ -78,6 +79,7 @@
     void setRedirectStart(double);
     void markRedirectEnd();
     void notifyDocumentTimingChanged();
+    LocalFrame* frame() const;
 
     double m_referenceMonotonicTime;
     double m_referenceWallTime;
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.h b/third_party/WebKit/Source/core/loader/DocumentLoader.h
index 126c313..a1089507e 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoader.h
+++ b/third_party/WebKit/Source/core/loader/DocumentLoader.h
@@ -182,6 +182,7 @@
     void dataReceived(Resource*, const char* data, unsigned length) final;
     void processData(const char* data, unsigned length);
     void notifyFinished(Resource*) final;
+    String debugName() const override { return "DocumentLoader"; }
 
     bool maybeLoadEmpty();
 
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
index 5e62f1a..dd691c5 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
@@ -81,6 +81,8 @@
         // |this| may be dead after calling this method.
         void notifyFinished(Resource*) override;
 
+        String debugName() const override { return "DocumentThreadableLoader"; }
+
         // RawResourceClient
         //
         // |this| may be dead after calling these methods.
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.h b/third_party/WebKit/Source/core/loader/LinkLoader.h
index de920e5..7e248ca 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoader.h
+++ b/third_party/WebKit/Source/core/loader/LinkLoader.h
@@ -57,6 +57,7 @@
 
     // from ResourceClient
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "LinkLoader"; }
 
     // from PrerenderClient
     void didStartPrerender() override;
diff --git a/third_party/WebKit/Source/core/loader/SinkDocument.h b/third_party/WebKit/Source/core/loader/SinkDocument.h
index 8a2ceb4..84bafa90 100644
--- a/third_party/WebKit/Source/core/loader/SinkDocument.h
+++ b/third_party/WebKit/Source/core/loader/SinkDocument.h
@@ -41,6 +41,8 @@
     SinkDocument(const DocumentInit&);
 
     PassRefPtrWillBeRawPtr<DocumentParser> createParser() override;
+
+    String debugName() const override { return "SinkDocument"; }
 };
 
 
diff --git a/third_party/WebKit/Source/core/loader/TextTrackLoader.h b/third_party/WebKit/Source/core/loader/TextTrackLoader.h
index f778ef5..b301b35 100644
--- a/third_party/WebKit/Source/core/loader/TextTrackLoader.h
+++ b/third_party/WebKit/Source/core/loader/TextTrackLoader.h
@@ -72,6 +72,7 @@
     // RawResourceClient
     void dataReceived(Resource*, const char* data, unsigned length) override;
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "TextTrackLoader"; }
 
     // VTTParserClient
     void newCuesParsed() override;
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h b/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h
index 97fbdb0..c4018fa 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h
@@ -61,6 +61,7 @@
 
     void updateReferenceFilterClients(const FilterOperations&);
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "PaintLayerFilterInfo"; }
     void removeReferenceFilterClients();
 
 private:
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index 2cfe368..d810f82 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -1638,6 +1638,16 @@
     return isLeftToRightDirection() ? borderBottomWidth() : borderTopWidth();
 }
 
+int ComputedStyle::borderOverWidth() const
+{
+    return isHorizontalWritingMode() ? borderTopWidth() : borderRightWidth();
+}
+
+int ComputedStyle::borderUnderWidth() const
+{
+    return isHorizontalWritingMode() ? borderBottomWidth() : borderLeftWidth();
+}
+
 void ComputedStyle::setMarginStart(const Length& margin)
 {
     if (isHorizontalWritingMode()) {
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index d8eff8e..9952068a 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -531,6 +531,8 @@
     int borderAfterWidth() const;
     int borderStartWidth() const;
     int borderEndWidth() const;
+    int borderOverWidth() const;
+    int borderUnderWidth() const;
 
     int outlineWidth() const
     {
@@ -698,6 +700,8 @@
     const Length& marginAfter() const { return surround->margin.after(writingMode()); }
     const Length& marginStart() const { return surround->margin.start(writingMode(), direction()); }
     const Length& marginEnd() const { return surround->margin.end(writingMode(), direction()); }
+    const Length& marginOver() const { return surround->margin.over(writingMode()); }
+    const Length& marginUnder() const { return surround->margin.under(writingMode()); }
     const Length& marginStartUsing(const ComputedStyle* otherStyle) const { return surround->margin.start(otherStyle->writingMode(), otherStyle->direction()); }
     const Length& marginEndUsing(const ComputedStyle* otherStyle) const { return surround->margin.end(otherStyle->writingMode(), otherStyle->direction()); }
     const Length& marginBeforeUsing(const ComputedStyle* otherStyle) const { return surround->margin.before(otherStyle->writingMode()); }
@@ -712,6 +716,8 @@
     const Length& paddingAfter() const { return surround->padding.after(writingMode()); }
     const Length& paddingStart() const { return surround->padding.start(writingMode(), direction()); }
     const Length& paddingEnd() const { return surround->padding.end(writingMode(), direction()); }
+    const Length& paddingOver() const { return surround->padding.over(writingMode()); }
+    const Length& paddingUnder() const { return surround->padding.under(writingMode()); }
 
     ECursor cursor() const { return static_cast<ECursor>(inherited_flags._cursor_style); }
     CursorList* cursors() const { return rareInheritedData->cursorData.get(); }
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.h b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
index 891eb61..9730098 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImage.h
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
@@ -59,6 +59,7 @@
     void addClient(LayoutObject*) override;
     void removeClient(LayoutObject*) override;
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "StyleFetchedImage"; }
     PassRefPtr<Image> image(const LayoutObject*, const IntSize&) const override;
     bool knownToBeOpaque(const LayoutObject*) const override;
     ImageResource* cachedImage() const override;
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
index 01e7f06..21c20568 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
@@ -80,6 +80,8 @@
 private:
     StyleFetchedImageSet(ImageResource*, float imageScaleFactor, CSSImageSetValue*);
 
+    String debugName() const override { return "StyleFetchedImageSet"; }
+
     ResourcePtr<ImageResource> m_bestFitImage;
     float m_imageScaleFactor;
 
diff --git a/third_party/WebKit/Source/core/svg/SVGFEImageElement.h b/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
index 9bf8f86..fe54161 100644
--- a/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
+++ b/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
@@ -54,6 +54,7 @@
 
     void svgAttributeChanged(const QualifiedName&) override;
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "SVGFEImageElement"; }
 
     PassRefPtrWillBeRawPtr<FilterEffect> build(SVGFilterBuilder*, Filter*) override;
 
diff --git a/third_party/WebKit/Source/core/svg/SVGImageLoader.h b/third_party/WebKit/Source/core/svg/SVGImageLoader.h
index 1999d7c..8e4a0f5 100644
--- a/third_party/WebKit/Source/core/svg/SVGImageLoader.h
+++ b/third_party/WebKit/Source/core/svg/SVGImageLoader.h
@@ -36,6 +36,7 @@
 private:
     explicit SVGImageLoader(SVGImageElement*);
     void dispatchLoadEvent() override;
+    String debugName() const override { return "SVGImageLoader"; }
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.h b/third_party/WebKit/Source/core/svg/SVGUseElement.h
index 68144f8..ff14e9f 100644
--- a/third_party/WebKit/Source/core/svg/SVGUseElement.h
+++ b/third_party/WebKit/Source/core/svg/SVGUseElement.h
@@ -102,6 +102,7 @@
     Document* externalDocument() const;
     bool instanceTreeIsLoading(const SVGElement*);
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "SVGUseElement"; }
     TreeScope* referencedScope() const;
     void setDocumentResource(ResourcePtr<DocumentResource>);
 
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
index 0dcc21a..b35376b3 100644
--- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
+++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
@@ -121,6 +121,7 @@
 
     // from ResourceClient
     void notifyFinished(Resource*) override;
+    String debugName() const override { return "XMLDocumentParser"; }
 
     void end();
 
diff --git a/third_party/WebKit/Source/devtools/devtools.gypi b/third_party/WebKit/Source/devtools/devtools.gypi
index 82c2807..81790f9 100644
--- a/third_party/WebKit/Source/devtools/devtools.gypi
+++ b/third_party/WebKit/Source/devtools/devtools.gypi
@@ -433,7 +433,6 @@
             'front_end/elements/PropertyChangeHighlighter.js',
             'front_end/elements/Spectrum.js',
             'front_end/elements/StylesPopoverHelper.js',
-            'front_end/elements/StylesSectionModel.js',
             'front_end/elements/StylesSidebarPane.js',
             'front_end/elements/ComputedStyleWidget.js',
         ],
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationGroupPreviewUI.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationGroupPreviewUI.js
index 4c4f12d..b463ff6 100644
--- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationGroupPreviewUI.js
+++ b/third_party/WebKit/Source/devtools/front_end/animation/AnimationGroupPreviewUI.js
@@ -10,11 +10,13 @@
 {
     this._model = model;
     this.element = createElementWithClass("div", "animation-buffer-preview");
+    this._replayOverlayElement = this.element.createChild("div", "animation-buffer-preview-animation");
     this._svg = this.element.createSVGChild("svg");
     this._svg.setAttribute("width", "100%");
     this._svg.setAttribute("preserveAspectRatio", "none");
     this._svg.setAttribute("height", "100%");
-    this._svg.setAttribute("viewBox", "0 0 100 27");
+    this._viewBoxHeight = 32;
+    this._svg.setAttribute("viewBox", "0 0 100 " + this._viewBoxHeight);
     this._svg.setAttribute("shape-rendering", "crispEdges");
     this._render();
 }
@@ -34,17 +36,27 @@
         return duration;
     },
 
+    replay: function()
+    {
+        this._replayOverlayElement.animate([
+                { offset: 0, width: "0%", opacity: 1 },
+                { offset: 0.9, width: "100%", opacity: 1 },
+                { offset: 1, width: "100%", opacity: 0 }
+            ], { duration : 200, easing: "cubic-bezier(0, 0, 0.2, 1)" });
+    },
+
     _render: function()
     {
         this._svg.removeChildren();
-        const numberOfAnimations = Math.min(this._model.animations().length, 10);
+        var maxToShow = 10;
+        var numberOfAnimations = Math.min(this._model.animations().length, maxToShow);
         var timeToPixelRatio = 100 / Math.max(this._groupDuration(), 300);
         for (var i = 0; i < numberOfAnimations; i++) {
             var effect = this._model.animations()[i].source();
             var line = this._svg.createSVGChild("line");
             line.setAttribute("x1", effect.delay() * timeToPixelRatio);
             line.setAttribute("x2", (effect.delay() + effect.duration()) * timeToPixelRatio);
-            var y = Math.floor(27 / numberOfAnimations * i) + 1;
+            var y = Math.floor(this._viewBoxHeight / Math.max(6, numberOfAnimations) * i + 1);
             line.setAttribute("y1", y);
             line.setAttribute("y2", y);
             line.style.stroke = WebInspector.AnimationUI.Color(this._model.animations()[i]);
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationModel.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationModel.js
index 882e2b1..252ea1f 100644
--- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/animation/AnimationModel.js
@@ -23,8 +23,7 @@
 }
 
 WebInspector.AnimationModel.Events = {
-    AnimationGroupStarted: "AnimationGroupStarted",
-    AnimationCanceled: "AnimationCanceled"
+    AnimationGroupStarted: "AnimationGroupStarted"
 }
 
 WebInspector.AnimationModel.prototype = {
@@ -43,14 +42,28 @@
         this._pendingAnimations.push(id);
     },
 
+    _animationCanceled: function(id)
+    {
+        this._pendingAnimations.remove(id);
+        this._flushPendingAnimationsIfNeeded();
+    },
+
     /**
      * @param {!AnimationAgent.Animation} payload
      */
     animationStarted: function(payload)
     {
         var animation = WebInspector.AnimationModel.Animation.parsePayload(this.target(), payload);
-        this._animationsById.set(animation.id(), animation);
+        // Ignore Web Animations custom effects & groups.
+        if (animation.type() === "WebAnimation" && animation.source().keyframesRule().keyframes().length === 0)
+            this._pendingAnimations.remove(animation.id());
+        else
+           this._animationsById.set(animation.id(), animation);
+        this._flushPendingAnimationsIfNeeded();
+    },
 
+    _flushPendingAnimationsIfNeeded: function()
+    {
         for (var id of this._pendingAnimations) {
             if (!this._animationsById.get(id))
                 return;
@@ -752,6 +765,15 @@
 
     /**
      * @override
+     * @param {string} id
+     */
+    animationCanceled: function(id)
+    {
+        this._animationModel._animationCanceled(id);
+    },
+
+    /**
+     * @override
      * @param {!AnimationAgent.Animation} payload
      */
     animationStarted: function(payload)
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js
index 31c2b2c..3e7bab7 100644
--- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js
+++ b/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js
@@ -19,16 +19,12 @@
     this._timelineScrubberHead.textContent = WebInspector.UIString(Number.millisToString(0));
 
     this._underlyingPlaybackRate = 1;
-    this.contentElement.appendChild(this._createHeader());
+    this._createHeader();
     this._animationsContainer = this.contentElement.createChild("div", "animation-timeline-rows");
 
-    this._emptyTimelineMessage = this._animationsContainer.createChild("div", "animation-timeline-empty-message");
-    var message = this._emptyTimelineMessage.createChild("div");
-    message.textContent = WebInspector.UIString("Trigger animations on the page to view and tweak them on the animation timeline.");
-
     this._duration = this._defaultDuration();
-    this._scrubberRadius = 30;
-    this._timelineControlsWidth = 230;
+    this._scrubberRadius = 25;
+    this._timelineControlsWidth = 175;
     /** @type {!Map.<!DOMAgent.BackendNodeId, !WebInspector.AnimationTimeline.NodeUI>} */
     this._nodesMap = new Map();
     this._groupBuffer = [];
@@ -121,9 +117,6 @@
         return this._timelineScrubber;
     },
 
-    /**
-     * @return {!Element}
-     */
     _createHeader: function()
     {
         /**
@@ -136,9 +129,9 @@
             this._updatePlaybackControls();
         }
 
-        var container = createElementWithClass("div", "animation-timeline-header");
+        this._previewContainer = this.contentElement.createChild("div", "animation-timeline-buffer");
+        var container = this.contentElement.createChild("div", "animation-timeline-header");
         var controls = container.createChild("div", "animation-controls");
-        this._previewContainer = container.createChild("div", "animation-timeline-buffer");
 
         var toolbar = new WebInspector.Toolbar(controls);
         toolbar.element.classList.add("animation-controls-toolbar");
@@ -198,8 +191,6 @@
 
     _controlButtonToggle: function()
     {
-        if (this._emptyTimelineMessage)
-            return;
         if (this._controlButton.element.classList.contains("play-outline-toolbar-item"))
             this._togglePause(false);
         else if (this._controlButton.element.classList.contains("replay-outline-toolbar-item"))
@@ -363,7 +354,8 @@
         if (this._previewMap.get(group)) {
             if (this._selectedGroup === group)
                 this._syncScrubber();
-            this._previewMap.get(group).element.animate([{ opacity: "0.3", transform: "scale(0.7)" }, { opacity: "1", transform: "scale(1)" }], { duration : 150, easing: "cubic-bezier(0, 0, 0.2, 1)" });
+            else
+                this._previewMap.get(group).replay();
             return;
         }
         this._groupBuffer.push(group);
@@ -430,15 +422,6 @@
             node[this._symbol] = nodeUI;
         }
 
-        if (this._emptyTimelineMessage) {
-            this._emptyTimelineMessage.remove();
-            delete this._emptyTimelineMessage;
-        }
-
-        // Ignore Web Animations custom effects & groups
-        if (animation.type() === "WebAnimation" && animation.source().keyframesRule().keyframes().length === 0)
-            return;
-
         this._resizeWindow(animation);
 
         var nodeUI = this._nodesMap.get(animation.source().backendNodeId());
@@ -468,14 +451,14 @@
     {
         const gridSize = 250;
         this._grid.setAttribute("width", this.width());
-        this._grid.setAttribute("height", this._animationsContainer.offsetHeight + 43);
+        this._grid.setAttribute("height", this._animationsContainer.offsetHeight + 30);
         this._grid.setAttribute("shape-rendering", "crispEdges");
         this._grid.removeChildren();
         var lastDraw = undefined;
         for (var time = 0; time < this.duration(); time += gridSize) {
             var line = this._grid.createSVGChild("rect", "animation-timeline-grid-line");
             line.setAttribute("x", time * this.pixelMsRatio());
-            line.setAttribute("y", 0);
+            line.setAttribute("y", 23);
             line.setAttribute("height", "100%");
             line.setAttribute("width", 1);
         }
@@ -485,7 +468,7 @@
                 lastDraw = gridWidth;
                 var label = this._grid.createSVGChild("text", "animation-timeline-grid-label");
                 label.setAttribute("x", gridWidth + 5);
-                label.setAttribute("y", 15);
+                label.setAttribute("y", 16);
                 label.textContent = WebInspector.UIString(Number.millisToString(time));
             }
         }
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js
index 58cbff93..349d141 100644
--- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js
+++ b/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js
@@ -374,8 +374,8 @@
 }
 
 WebInspector.AnimationUI.Options = {
-    AnimationHeight: 32,
-    AnimationSVGHeight: 80,
+    AnimationHeight: 26,
+    AnimationSVGHeight: 50,
     AnimationMargin: 7,
     EndpointsClickRegionSize: 10,
     GridCanvasHeight: 40
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css b/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css
index 08686f30..79cc6eb 100644
--- a/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css
+++ b/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css
@@ -7,36 +7,30 @@
 .animation-node-row {
     width: 100%;
     display: flex;
-    border-bottom: 1px dashed #ccc;
-}
-
-.animation-node-row:first-child > .animation-node-description {
-    line-height: 45px;
-}
-
-.animation-node-row:first-child > .animation-node-timeline {
-    padding-top: 5px;
+    border-bottom: 1px dashed hsla(0,0%,94%,1);
 }
 
 .animation-node-description {
-    display: inline-block;
-    min-width: 200px;
-    max-width: 200px;
-    padding-left: 15px;
+    width: 150px;
+    padding-left: 8px;
     overflow: hidden;
     position: relative;
     transform-style: preserve-3d;
-    line-height: 40px;
     border-bottom: 1px solid hsl(0, 0%, 90%);
     margin-bottom: -1px;
-    margin-right: 30px;
+    margin-right: 26px;
     background-color: hsl(0, 0%, 98%);
-    text-overflow: ellipsis;
-    white-space: nowrap;
+    display: flex;
+    align-items: center;
+    flex: 0 0 150px;
+}
+
+.animation-node-description > * {
+    flex: 0 0 auto;
 }
 
 .animation-timeline-row {
-    height: 40px;
+    height: 32px;
     position: relative;
 }
 
@@ -80,18 +74,16 @@
 
 .animation-name {
     position: absolute;
-    top: 15px;
+    top: 8px;
     color: #333;
     text-align: center;
     margin-left: -8px;
-    text-overflow: ellipsis;
-    overflow: hidden;
     white-space: nowrap;
     min-width: 50px;
 }
 
 .animation-timeline-header {
-    height: 44px;
+    height: 30px;
     border-bottom: 1px solid #ccc;
     flex-shrink: 0;
     display: flex;
@@ -99,9 +91,9 @@
 
 .animation-timeline-header:after {
     content: "";
-    height: 100%;
+    height: calc(100% - 48px);
     position: absolute;
-    width: 200px;
+    width: 150px;
     left: 0;
     background-color: hsl(0, 0%, 98%);
     z-index: -1;
@@ -109,18 +101,16 @@
 }
 
 .animation-controls {
-    flex: 0 0 200px;
-    padding: 10px;
+    flex: 0 0 150px;
+    padding: 1px;
     height: 100%;
-    line-height: 22px;
-    background-color: hsl(0, 0%, 98%);
-    border-right: 1px solid hsl(0, 0%, 90%);
+    position: relative;
 }
 
 .animation-timeline-buffer {
-    height: 100%;
-    flex-grow: 1;
-    border-left: 1px solid #ccc;
+    height: 48px;
+    flex: 0 0 auto;
+    border-bottom: 1px solid #ccc;
     display: flex;
     padding: 0 2px;
 }
@@ -138,11 +128,11 @@
 }
 
 input.animation-playback-slider {
-    width: 93px;
-    margin-left: 12px;
+    width: 65px;
+    margin-left: 7px;
     -webkit-appearance: none;
     position: absolute;
-    top: 7px;
+    top: 1px;
     background: none;
 }
 
@@ -175,7 +165,6 @@
     display: inline-block;
     width: 40px;
     height: 22px;
-    overflow: hidden;
     text-align: center;
     border: 1px solid #dadada;
     border-radius: 2px;
@@ -186,16 +175,18 @@
     white-space: nowrap;
     overflow: hidden;
     -webkit-user-modify: read-write-plaintext-only;
+    margin: 2px;
 }
 
 .animation-scrubber {
     opacity: 1;
     position: absolute;
-    left: 230px;
-    height: calc(100% - 43px);
-    width: calc(100% - 200px);
-    top: 43px;
+    left: 175px;
+    height: calc(100% - 78px);
+    width: calc(100% - 175px);
+    top: 78px;
     border-left: 1px solid rgba(0,0,0,0.5);
+    z-index: 10;
 }
 
 .animation-scrubber.animation-timeline-end {
@@ -204,7 +195,7 @@
 
 .animation-scrubber-head {
     background-color: rgba(0, 0, 0, 0.7);
-    width: 60px;
+    width: 50px;
     height: 23px;
     color: white;
     line-height: 23px;
@@ -212,13 +203,12 @@
     border-radius: 5px;
     position: relative;
     top: -29px;
-    left: -30px;
+    left: -25px;
     font-size: 10px;
     visibility: visible;
 }
 
 .animation-scrubber-head:before, .animation-scrubber-head:after {
-    content: "||";
     position: absolute;
     color: #999;
     font-size: 8px;
@@ -256,12 +246,12 @@
 
 svg.animation-timeline-grid {
     position: absolute;
-    left: 230px;
-    top: 43px;
+    left: 175px;
+    top: 48px;
 }
 
 rect.animation-timeline-grid-line {
-    fill: hsl(0, 0%, 90%);
+    fill: hsla(0,0%,93%,1);
 }
 
 .animation-timeline-row > svg.animation-ui {
@@ -298,7 +288,7 @@
 
 text.animation-timeline-grid-label {
     font-size: 10px;
-    fill: #999;
+    fill: #5a5a5a;
 }
 
 .animation-timeline-rows {
@@ -334,20 +324,50 @@
 }
 
 .animation-buffer-preview {
-    height: 35px;
+    height: 40px;
     margin: 4px 2px;
     background-color: #F3F3F3;
     border-radius: 2px;
     flex: 1 1;
     padding: 4px;
     max-width: 100px;
+    animation: newGroupAnim 200ms;
+    position: relative;
 }
+
+.animation-buffer-preview-animation {
+    width: 100%;
+    height: 100%;
+    border-radius: 2px 0 0 2px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: hsla(219, 100%, 66%, 0.27);
+    opacity: 0;
+    border-right: 1px solid #A7A7A7;
+}
+
+.animation-buffer-preview:not(.selected):hover {
+    background-color: hsla(217,90%,92%,1);
+}
+
 .animation-buffer-preview.selected {
     background-color: hsl(217, 89%, 61%);
 }
+
 .animation-buffer-preview.selected > svg > line {
     stroke: white !important;
 }
+
 .animation-buffer-preview > svg > line {
     stroke-width: 1px;
 }
+
+@keyframes newGroupAnim {
+    from {
+        -webkit-clip-path: polygon(0% 0%, 0% 100%, 0% 100%, 0% 0%);
+    }
+    to {
+        -webkit-clip-path: polygon(0% 0%, 0% 100%, 100% 100%, 100% 0%);
+    }
+}
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js b/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
index 2c17cfa8..0bd8e37 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/DOMPresentationUtils.js
@@ -31,25 +31,31 @@
 
 WebInspector.DOMPresentationUtils = {}
 
+/**
+ * @param {!WebInspector.DOMNode} node
+ * @param {!Element} parentElement
+ */
 WebInspector.DOMPresentationUtils.decorateNodeLabel = function(node, parentElement)
 {
+    var originalNode = node;
+    var isPseudo = node.nodeType() === Node.ELEMENT_NODE && node.pseudoType();
+    if (isPseudo && node.parentNode)
+        node = node.parentNode;
+
     var title = node.nodeNameInCorrectCase();
 
-    var nameElement = createElement("span");
+    var nameElement = parentElement.createChild("span", "node-label-name");
     nameElement.textContent = title;
-    parentElement.appendChild(nameElement);
 
     var idAttribute = node.getAttribute("id");
     if (idAttribute) {
-        var idElement = createElement("span");
-        parentElement.appendChild(idElement);
-
+        var idElement = parentElement.createChild("span", "node-label-id");
         var part = "#" + idAttribute;
         title += part;
         idElement.createTextChild(part);
 
         // Mark the name as extra, since the ID is more important.
-        nameElement.className = "extra";
+        nameElement.classList.add("extra");
     }
 
     var classAttribute = node.getAttribute("class");
@@ -58,10 +64,7 @@
         var foundClasses = {};
 
         if (classes.length) {
-            var classesElement = createElement("span");
-            classesElement.className = "extra";
-            parentElement.appendChild(classesElement);
-
+            var classesElement = parentElement.createChild("span", "extra node-label-class");
             for (var i = 0; i < classes.length; ++i) {
                 var className = classes[i];
                 if (className && !(className in foundClasses)) {
@@ -73,6 +76,13 @@
             }
         }
     }
+
+    if (isPseudo) {
+        var pseudoElement = parentElement.createChild("span", "extra node-label-pseudo");
+        var pseudoText = "::" + originalNode.pseudoType();
+        pseudoElement.createTextChild(pseudoText);
+        title += pseudoText;
+    }
     parentElement.title = title;
 }
 
@@ -99,7 +109,7 @@
     if (!node)
         return createTextNode(WebInspector.UIString("<node>"));
 
-    var root = createElement("span");
+    var root = createElementWithClass("span", "monospace");
     var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root);
     shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/domUtils.css"));
     var link = shadowRoot.createChild("div", "node-link");
diff --git a/third_party/WebKit/Source/devtools/front_end/components/domUtils.css b/third_party/WebKit/Source/devtools/front_end/components/domUtils.css
index 1286b437..79e2544 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/domUtils.css
+++ b/third_party/WebKit/Source/devtools/front_end/components/domUtils.css
@@ -9,7 +9,6 @@
 }
 
 .node-link {
-    text-decoration: underline;
     cursor: pointer;
     display: inline;
 }
@@ -30,3 +29,15 @@
 .stack-preview-container td {
     white-space: nowrap;
 }
+
+.node-label-name {
+    color: rgb(136, 18, 128);
+}
+
+.node-label-id {
+    color: rgb(26, 26, 166);
+}
+
+.node-label-class, .node-label-pseudo {
+    color: rgb(153, 69, 0);
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/BezierUI.js b/third_party/WebKit/Source/devtools/front_end/elements/BezierUI.js
index b7ab78fe..28517c9 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/BezierUI.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/BezierUI.js
@@ -100,7 +100,7 @@
     }
 }
 
-WebInspector.BezierUI.Height = 32;
+WebInspector.BezierUI.Height = 26;
 
 /**
  * @param {!WebInspector.Geometry.CubicBezier} bezier
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js b/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js
index aa83b1fa..a098597 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js
@@ -124,21 +124,21 @@
 
     /**
      * @param {?WebInspector.SharedSidebarModel.ComputedStyle} nodeStyle
-     * @param {?{matched: !WebInspector.SectionCascade, pseudo: !Map.<number, !WebInspector.SectionCascade>}} cascades
+     * @param {?WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
      */
-    _innerRebuildUpdate: function(nodeStyle, cascades)
+    _innerRebuildUpdate: function(nodeStyle, matchedStyles)
     {
         this._propertiesOutline.removeChildren();
         this._linkifier.reset();
         var cssModel = this._sharedModel.cssModel();
-        if (!nodeStyle || !cascades || !cssModel)
+        if (!nodeStyle || !matchedStyles || !cssModel)
             return;
 
         var uniqueProperties = nodeStyle.computedStyle.keysArray();
         uniqueProperties.sort(propertySorter);
 
-        var propertyTraces = this._computePropertyTraces(cascades.matched);
-        var inhertiedProperties = this._computeInheritedProperties(cascades.matched);
+        var propertyTraces = this._computePropertyTraces(matchedStyles);
+        var inhertiedProperties = this._computeInheritedProperties(matchedStyles);
         var showInherited = this._showInheritedComputedStylePropertiesSetting.get();
         for (var i = 0; i < uniqueProperties.length; ++i) {
             var propertyName = uniqueProperties[i];
@@ -175,7 +175,7 @@
 
             var trace = propertyTraces.get(propertyName);
             if (trace) {
-                this._renderPropertyTrace(cssModel, cascades.matched, nodeStyle.node, treeElement, trace);
+                this._renderPropertyTrace(cssModel, matchedStyles, nodeStyle.node, treeElement, trace);
                 treeElement.listItemElement.addEventListener("mousedown", consumeEvent, false);
                 treeElement.listItemElement.addEventListener("dblclick", consumeEvent, false);
                 treeElement.listItemElement.addEventListener("click", handleClick.bind(null, treeElement), false);
@@ -213,17 +213,17 @@
 
     /**
      * @param {!WebInspector.CSSStyleModel} cssModel
-     * @param {!WebInspector.SectionCascade} matchedCascade
+     * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
      * @param {!WebInspector.DOMNode} node
      * @param {!TreeElement} rootTreeElement
      * @param {!Array<!WebInspector.CSSProperty>} tracedProperties
      */
-    _renderPropertyTrace: function(cssModel, matchedCascade, node, rootTreeElement, tracedProperties)
+    _renderPropertyTrace: function(cssModel, matchedStyles, node, rootTreeElement, tracedProperties)
     {
         for (var property of tracedProperties) {
             var trace = createElement("div");
             trace.classList.add("property-trace");
-            if (matchedCascade.propertyState(property) === WebInspector.SectionCascade.PropertyState.Overloaded)
+            if (matchedStyles.propertyState(property) === WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded)
                 trace.classList.add("property-trace-inactive");
 
             var renderer = new WebInspector.StylesSidebarPropertyRenderer(null, node, property.name, /** @type {string} */(property.value));
@@ -250,17 +250,16 @@
     },
 
     /**
-     * @param {!WebInspector.SectionCascade} matchedCascade
+     * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
      * @return {!Map<string, !Array<!WebInspector.CSSProperty>>}
      */
-    _computePropertyTraces: function(matchedCascade)
+    _computePropertyTraces: function(matchedStyles)
     {
         var result = new Map();
-        var styles = matchedCascade.styles();
-        for (var style of styles) {
+        for (var style of matchedStyles.nodeStyles()) {
             var allProperties = style.allProperties;
             for (var property of allProperties) {
-                if (!property.activeInStyle() || !matchedCascade.propertyState(property))
+                if (!property.activeInStyle() || !matchedStyles.propertyState(property))
                     continue;
                 if (!result.has(property.name))
                     result.set(property.name, []);
@@ -271,15 +270,15 @@
     },
 
     /**
-     * @param {!WebInspector.SectionCascade} matchedCascade
+     * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
      * @return {!Set<string>}
      */
-    _computeInheritedProperties: function(matchedCascade)
+    _computeInheritedProperties: function(matchedStyles)
     {
         var result = new Set();
-        for (var style of matchedCascade.styles()) {
+        for (var style of matchedStyles.nodeStyles()) {
             for (var property of style.allProperties) {
-                if (!matchedCascade.propertyState(property))
+                if (!matchedStyles.propertyState(property))
                     continue;
                 result.add(WebInspector.CSSMetadata.canonicalPropertyName(property.name));
             }
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/StylesSectionModel.js b/third_party/WebKit/Source/devtools/front_end/elements/StylesSectionModel.js
deleted file mode 100644
index d4439ea..0000000
--- a/third_party/WebKit/Source/devtools/front_end/elements/StylesSectionModel.js
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (c) 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @constructor
- * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
- * @param {!Array<!WebInspector.CSSStyleDeclaration>} styles
- */
-WebInspector.SectionCascade = function(matchedStyles, styles)
-{
-    this._matchedStyles = matchedStyles;
-    this._styles = styles;
-    this.resetActiveProperties();
-}
-
-/**
- * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
- * @return {!{matched: !WebInspector.SectionCascade, pseudo: !Map.<number, !WebInspector.SectionCascade>}}
- */
-WebInspector.SectionCascade.fromMatchedStyles = function(matchedStyles)
-{
-    var matched = new WebInspector.SectionCascade(matchedStyles, matchedStyles.nodeStyles());
-    var pseudo = new Map();
-
-    var pseudoStyles = matchedStyles.pseudoStyles();
-    var pseudoElements = pseudoStyles.keysArray();
-    for (var i = 0; i < pseudoElements.length; ++i) {
-        var pseudoElement = pseudoElements[i];
-        var pseudoCascade = new WebInspector.SectionCascade(matchedStyles, /** @type {!Array<!WebInspector.CSSStyleDeclaration>} */(pseudoStyles.get(pseudoElement)));
-        pseudo.set(pseudoElement, pseudoCascade);
-    }
-
-    return {
-        matched: matched,
-        pseudo: pseudo
-    };
-}
-
-WebInspector.SectionCascade.prototype = {
-    /**
-     * @param {!WebInspector.CSSStyleDeclaration} style
-     * @return {boolean}
-     */
-    hasMatchingSelectors: function(style)
-    {
-        return style.parentRule ? style.parentRule.matchingSelectors && style.parentRule.matchingSelectors.length > 0 && this.mediaMatches(style) : true;
-    },
-
-    /**
-     * @param {!WebInspector.CSSStyleDeclaration} style
-     * @return {boolean}
-     */
-    mediaMatches: function(style)
-    {
-        var media = style.parentRule ? style.parentRule.media : [];
-        for (var i = 0; media && i < media.length; ++i) {
-            if (!media[i].active())
-                return false;
-        }
-        return true;
-    },
-
-    /**
-     * @param {!WebInspector.CSSStyleDeclaration} style
-     * @return {?WebInspector.DOMNode}
-     */
-    nodeForStyle: function(style)
-    {
-        return this._matchedStyles.nodeForStyle(style);
-    },
-
-    /**
-     * @param {!WebInspector.CSSStyleDeclaration} style
-     * @return {boolean}
-     */
-    isInherited: function(style)
-    {
-        return this._matchedStyles.isInherited(style);
-    },
-
-    /**
-     * @return {!Array.<!WebInspector.CSSStyleDeclaration>}
-     */
-    styles: function()
-    {
-        return this._styles;
-    },
-
-    /**
-     * @param {!WebInspector.CSSProperty} property
-     * @return {?WebInspector.SectionCascade.PropertyState}
-     */
-    propertyState: function(property)
-    {
-        if (this._propertiesState.size === 0)
-            this._propertiesState = this._computeActiveProperties();
-        return this._propertiesState.get(property) || null;
-    },
-
-    resetActiveProperties: function()
-    {
-        /** @type {!Map<!WebInspector.CSSProperty, !WebInspector.SectionCascade.PropertyState>} */
-        this._propertiesState = new Map();
-    },
-
-    /**
-     * @return {!Map<!WebInspector.CSSProperty, !WebInspector.SectionCascade.PropertyState>}
-     */
-    _computeActiveProperties: function()
-    {
-        /** @type {!Set.<string>} */
-        var foundImportantProperties = new Set();
-        /** @type {!Map.<string, !Map<string, !WebInspector.CSSProperty>>} */
-        var propertyToEffectiveRule = new Map();
-        /** @type {!Map.<string, !WebInspector.DOMNode>} */
-        var inheritedPropertyToNode = new Map();
-        /** @type {!Set<string>} */
-        var allUsedProperties = new Set();
-        var result = new Map();
-        for (var i = 0; i < this._styles.length; ++i) {
-            var style = this._styles[i];
-            if (!this.hasMatchingSelectors(style))
-                continue;
-
-            /** @type {!Map<string, !WebInspector.CSSProperty>} */
-            var styleActiveProperties = new Map();
-            var allProperties = style.allProperties;
-            for (var j = 0; j < allProperties.length; ++j) {
-                var property = allProperties[j];
-
-                // Do not pick non-inherited properties from inherited styles.
-                var inherited = this._matchedStyles.isInherited(style);
-                if (inherited && !WebInspector.CSSMetadata.isPropertyInherited(property.name))
-                    continue;
-
-                if (!property.activeInStyle()) {
-                    result.set(property, WebInspector.SectionCascade.PropertyState.Overloaded);
-                    continue;
-                }
-
-                var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(property.name);
-                if (foundImportantProperties.has(canonicalName)) {
-                    result.set(property, WebInspector.SectionCascade.PropertyState.Overloaded);
-                    continue;
-                }
-
-                if (!property.important && allUsedProperties.has(canonicalName)) {
-                    result.set(property, WebInspector.SectionCascade.PropertyState.Overloaded);
-                    continue;
-                }
-
-                var isKnownProperty = propertyToEffectiveRule.has(canonicalName);
-                var inheritedFromNode = inherited ? this._matchedStyles.nodeForStyle(style) : null;
-                if (!isKnownProperty && inheritedFromNode && !inheritedPropertyToNode.has(canonicalName))
-                    inheritedPropertyToNode.set(canonicalName, inheritedFromNode);
-
-                if (property.important) {
-                    if (inherited && isKnownProperty && inheritedFromNode !== inheritedPropertyToNode.get(canonicalName)) {
-                        result.set(property, WebInspector.SectionCascade.PropertyState.Overloaded);
-                        continue;
-                    }
-
-                    foundImportantProperties.add(canonicalName);
-                    if (isKnownProperty) {
-                        var overloaded = propertyToEffectiveRule.get(canonicalName).get(canonicalName);
-                        result.set(overloaded, WebInspector.SectionCascade.PropertyState.Overloaded);
-                        propertyToEffectiveRule.get(canonicalName).delete(canonicalName);
-                    }
-                }
-
-                styleActiveProperties.set(canonicalName, property);
-                allUsedProperties.add(canonicalName);
-                propertyToEffectiveRule.set(canonicalName, styleActiveProperties);
-                result.set(property, WebInspector.SectionCascade.PropertyState.Active);
-            }
-
-            // If every longhand of the shorthand is not active, then the shorthand is not active too.
-            for (var property of style.leadingProperties()) {
-                var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(property.name);
-                if (!styleActiveProperties.has(canonicalName))
-                    continue;
-                var longhands = style.longhandProperties(property.name);
-                if (!longhands.length)
-                    continue;
-                var notUsed = true;
-                for (var longhand of longhands) {
-                    var longhandCanonicalName = WebInspector.CSSMetadata.canonicalPropertyName(longhand.name);
-                    notUsed = notUsed && !styleActiveProperties.has(longhandCanonicalName);
-                }
-                if (!notUsed)
-                    continue;
-                styleActiveProperties.delete(canonicalName);
-                allUsedProperties.delete(canonicalName);
-                result.set(property, WebInspector.SectionCascade.PropertyState.Overloaded);
-            }
-        }
-        return result;
-    }
-}
-
-/** @enum {string} */
-WebInspector.SectionCascade.PropertyState = {
-    Active: "Active",
-    Overloaded: "Overloaded"
-}
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
index 957b42ea..4932473d 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
@@ -312,29 +312,25 @@
     },
 
     /**
-     * @return {!Promise.<?{matched: !WebInspector.SectionCascade, pseudo: !Map.<number, !WebInspector.SectionCascade>}>}
+     * @return {!Promise.<?WebInspector.CSSStyleModel.MatchedStyleResult>}
      */
     fetchMatchedCascade: function()
     {
         var node = this.node();
         if (!node)
-            return Promise.resolve(/** @type {?{matched: !WebInspector.SectionCascade, pseudo: !Map.<number, !WebInspector.SectionCascade>}} */(null));
+            return Promise.resolve(/** @type {?WebInspector.CSSStyleModel.MatchedStyleResult} */(null));
         if (!this._matchedCascadePromise)
-            this._matchedCascadePromise = this._matchedStylesForNode(node).then(buildMatchedCascades.bind(this, node));
+            this._matchedCascadePromise = this._matchedStylesForNode(node).then(validateStyles.bind(this));
         return this._matchedCascadePromise;
 
         /**
-         * @param {!WebInspector.DOMNode} node
          * @param {?WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
-         * @return {?{matched: !WebInspector.SectionCascade, pseudo: !Map.<number, !WebInspector.SectionCascade>}}
+         * @return {?WebInspector.CSSStyleModel.MatchedStyleResult}
          * @this {WebInspector.StylesSidebarPane}
          */
-        function buildMatchedCascades(node, matchedStyles)
+        function validateStyles(matchedStyles)
         {
-            if (!matchedStyles || node !== this.node())
-                return null;
-
-            return WebInspector.SectionCascade.fromMatchedStyles(matchedStyles);
+            return matchedStyles && matchedStyles.node() === this.node() ? matchedStyles : null;
         }
     },
 
@@ -409,29 +405,29 @@
     },
 
     /**
-     * @param {?{matched: !WebInspector.SectionCascade, pseudo: !Map.<number, !WebInspector.SectionCascade>}} cascades
+     * @param {?WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
      */
-    _innerRebuildUpdate: function(cascades)
+    _innerRebuildUpdate: function(matchedStyles)
     {
         this._linkifier.reset();
         this._sectionsContainer.removeChildren();
         this._sectionBlocks = [];
 
         var node = this.node();
-        if (!cascades || !node)
+        if (!matchedStyles || !node)
             return;
 
-        this._sectionBlocks = this._rebuildSectionsForMatchedStyleRules(cascades.matched);
+        this._sectionBlocks = this._rebuildSectionsForMatchedStyleRules(matchedStyles);
         var pseudoTypes = [];
-        var keys = new Set(cascades.pseudo.keys());
+        var keys = new Set(matchedStyles.pseudoStyles().keys());
         if (keys.delete(DOMAgent.PseudoType.Before))
             pseudoTypes.push(DOMAgent.PseudoType.Before);
         pseudoTypes = pseudoTypes.concat(keys.valuesArray().sort());
         for (var pseudoType of pseudoTypes) {
             var block = WebInspector.SectionBlock.createPseudoTypeBlock(pseudoType);
-            var cascade = cascades.pseudo.get(pseudoType);
-            for (var style of cascade.styles()) {
-                var section = new WebInspector.StylePropertiesSection(this, cascade, style);
+            var styles = /** @type {!Array<!WebInspector.CSSStyleDeclaration>} */(matchedStyles.pseudoStyles().get(pseudoType));
+            for (var style of styles) {
+                var section = new WebInspector.StylePropertiesSection(this, matchedStyles, style);
                 block.sections.push(section);
             }
             this._sectionBlocks.push(block);
@@ -461,22 +457,22 @@
     },
 
     /**
-     * @param {!WebInspector.SectionCascade} matchedCascade
+     * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
      * @return {!Array.<!WebInspector.SectionBlock>}
      */
-    _rebuildSectionsForMatchedStyleRules: function(matchedCascade)
+    _rebuildSectionsForMatchedStyleRules: function(matchedStyles)
     {
         var blocks = [new WebInspector.SectionBlock(null)];
         var lastParentNode = null;
-        for (var style of matchedCascade.styles()) {
-            var parentNode = matchedCascade.isInherited(style) ? matchedCascade.nodeForStyle(style) : null;
+        for (var style of matchedStyles.nodeStyles()) {
+            var parentNode = matchedStyles.isInherited(style) ? matchedStyles.nodeForStyle(style) : null;
             if (parentNode && parentNode !== lastParentNode) {
                 lastParentNode = parentNode;
                 var block = WebInspector.SectionBlock.createInheritedNodeBlock(lastParentNode);
                 blocks.push(block);
             }
 
-            var section = new WebInspector.StylePropertiesSection(this, matchedCascade, style);
+            var section = new WebInspector.StylePropertiesSection(this, matchedStyles, style);
             blocks.peekLast().sections.push(section);
         }
         return blocks;
@@ -533,7 +529,7 @@
     {
         this.expand();
         var node = this.node();
-        var blankSection = new WebInspector.BlankStylePropertiesSection(this, insertAfterSection._cascade, node ? WebInspector.DOMPresentationUtils.simpleSelector(node) : "", styleSheetId, ruleLocation, insertAfterSection._style);
+        var blankSection = new WebInspector.BlankStylePropertiesSection(this, insertAfterSection._matchedStyles, node ? WebInspector.DOMPresentationUtils.simpleSelector(node) : "", styleSheetId, ruleLocation, insertAfterSection._style);
 
         this._sectionsContainer.insertBefore(blankSection.element, insertAfterSection.element.nextSibling);
 
@@ -755,14 +751,14 @@
 /**
  * @constructor
  * @param {!WebInspector.StylesSidebarPane} parentPane
- * @param {!WebInspector.SectionCascade} cascade
+ * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
  * @param {!WebInspector.CSSStyleDeclaration} style
  */
-WebInspector.StylePropertiesSection = function(parentPane, cascade, style)
+WebInspector.StylePropertiesSection = function(parentPane, matchedStyles, style)
 {
     this._parentPane = parentPane;
     this._style = style;
-    this._cascade = cascade;
+    this._matchedStyles = matchedStyles;
     this.editable = !!(style.styleSheetId && style.range);
 
     var rule = style.parentRule;
@@ -882,9 +878,9 @@
      */
     _selectorText: function()
     {
-        var node = this._cascade.nodeForStyle(this._style);
+        var node = this._matchedStyles.nodeForStyle(this._style);
         if (this._style.type === WebInspector.CSSStyleDeclaration.Type.Inline)
-            return this._cascade.isInherited(this._style) ? WebInspector.UIString("Style Attribute") : "element.style";
+            return this._matchedStyles.isInherited(this._style) ? WebInspector.UIString("Style Attribute") : "element.style";
         if (this._style.type === WebInspector.CSSStyleDeclaration.Type.Attributes)
             return node.nodeNameInCorrectCase() + "[" + WebInspector.UIString("Attributes Style") + "]";
         return this._style.parentRule.selectorText();
@@ -1102,7 +1098,7 @@
      */
     isPropertyInherited: function(propertyName)
     {
-        if (this._cascade.isInherited(this._style)) {
+        if (this._matchedStyles.isInherited(this._style)) {
             // While rendering inherited stylesheet, reverse meaning of this property.
             // Render truly inherited properties with black, i.e. return them as non-inherited.
             return !WebInspector.CSSMetadata.isPropertyInherited(propertyName);
@@ -1161,7 +1157,7 @@
         } else {
             var child = this.propertiesTreeOutline.firstChild();
             while (child) {
-                var overloaded = this._cascade.propertyState(child.property) === WebInspector.SectionCascade.PropertyState.Overloaded;
+                var overloaded = this._matchedStyles.propertyState(child.property) === WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded;
                 child.setOverloaded(overloaded);
                 child = child.traverseNextTreeElement(false, null, true);
             }
@@ -1188,8 +1184,8 @@
         for (var property of style.leadingProperties()) {
             var isShorthand = !!WebInspector.CSSMetadata.cssPropertiesMetainfo.longhands(property.name);
             var inherited = this.isPropertyInherited(property.name);
-            var overloaded = this._cascade.propertyState(property) === WebInspector.SectionCascade.PropertyState.Overloaded;
-            var item = new WebInspector.StylePropertyTreeElement(this._parentPane, this._cascade, property, isShorthand, inherited, overloaded);
+            var overloaded = this._matchedStyles.propertyState(property) === WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded;
+            var item = new WebInspector.StylePropertyTreeElement(this._parentPane, this._matchedStyles, property, isShorthand, inherited, overloaded);
             this.propertiesTreeOutline.appendChild(item);
         }
     },
@@ -1217,9 +1213,9 @@
         if (!rule)
             return;
 
-        this._mediaListElement.classList.toggle("media-matches", this._cascade.mediaMatches(this._style));
+        this._mediaListElement.classList.toggle("media-matches", this._matchedStyles.mediaMatches(this._style));
 
-        if (!this._cascade.hasMatchingSelectors(this._style))
+        if (!this._matchedStyles.hasMatchingSelectors(this._style))
             return;
 
         var selectors = rule.selectors;
@@ -1287,7 +1283,7 @@
     addNewBlankProperty: function(index)
     {
         var property = this._style.newBlankProperty(index);
-        var item = new WebInspector.StylePropertyTreeElement(this._parentPane, this._cascade, property, false, false, false);
+        var item = new WebInspector.StylePropertyTreeElement(this._parentPane, this._matchedStyles, property, false, false, false);
         index = property.index;
         this.propertiesTreeOutline.insertChild(item, index);
         item.listItemElement.textContent = "";
@@ -1557,7 +1553,7 @@
                 var doesAffectSelectedNode = rule.matchingSelectors.length > 0;
                 this.element.classList.toggle("no-affect", !doesAffectSelectedNode);
 
-                this._cascade.resetActiveProperties();
+                this._matchedStyles.resetActiveProperties();
                 var newSelectorRange = /** @type {!WebInspector.TextRange} */(rule.selectorRange());
                 rule.style.sourceStyleSheetEdited(/** @type {string} */(rule.styleSheetId), oldSelectorRange, newSelectorRange);
                 this._parentPane._styleSheetRuleEdited(rule, oldSelectorRange, newSelectorRange);
@@ -1654,16 +1650,16 @@
  * @constructor
  * @extends {WebInspector.StylePropertiesSection}
  * @param {!WebInspector.StylesSidebarPane} stylesPane
- * @param {!WebInspector.SectionCascade} cascade
+ * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
  * @param {string} defaultSelectorText
  * @param {string} styleSheetId
  * @param {!WebInspector.TextRange} ruleLocation
  * @param {!WebInspector.CSSStyleDeclaration} insertAfterStyle
  */
-WebInspector.BlankStylePropertiesSection = function(stylesPane, cascade, defaultSelectorText, styleSheetId, ruleLocation, insertAfterStyle)
+WebInspector.BlankStylePropertiesSection = function(stylesPane, matchedStyles, defaultSelectorText, styleSheetId, ruleLocation, insertAfterStyle)
 {
     var rule = WebInspector.CSSRule.createDummyRule(stylesPane._cssModel, defaultSelectorText);
-    WebInspector.StylePropertiesSection.call(this, stylesPane, cascade, rule.style);
+    WebInspector.StylePropertiesSection.call(this, stylesPane, matchedStyles, rule.style);
     this._ruleLocation = ruleLocation;
     this._styleSheetId = styleSheetId;
     this._selectorRefElement.removeChildren();
@@ -1789,18 +1785,18 @@
  * @constructor
  * @extends {TreeElement}
  * @param {!WebInspector.StylesSidebarPane} stylesPane
- * @param {!WebInspector.SectionCascade} cascade
+ * @param {!WebInspector.CSSStyleModel.MatchedStyleResult} matchedStyles
  * @param {!WebInspector.CSSProperty} property
  * @param {boolean} isShorthand
  * @param {boolean} inherited
  * @param {boolean} overloaded
  */
-WebInspector.StylePropertyTreeElement = function(stylesPane, cascade, property, isShorthand, inherited, overloaded)
+WebInspector.StylePropertyTreeElement = function(stylesPane, matchedStyles, property, isShorthand, inherited, overloaded)
 {
     // Pass an empty title, the title gets made later in onattach.
     TreeElement.call(this, "", isShorthand);
     this._style = property.ownerStyle;
-    this._cascade = cascade;
+    this._matchedStyles = matchedStyles;
     this.property = property;
     this._inherited = inherited;
     this._overloaded = overloaded;
@@ -2020,7 +2016,7 @@
     _styleTextEdited: function(oldStyleRange)
     {
         var newStyleRange = /** @type {!WebInspector.TextRange} */ (this._style.range);
-        this._cascade.resetActiveProperties();
+        this._matchedStyles.resetActiveProperties();
         if (this._style.parentRule)
             this._parentPane._styleSheetRuleEdited(this._style.parentRule, oldStyleRange, newStyleRange);
     },
@@ -2074,10 +2070,10 @@
             var section = this.section();
             if (section) {
                 inherited = section.isPropertyInherited(name);
-                overloaded = this._cascade.propertyState(longhandProperties[i]) === WebInspector.SectionCascade.PropertyState.Overloaded;
+                overloaded = this._matchedStyles.propertyState(longhandProperties[i]) === WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded;
             }
 
-            var item = new WebInspector.StylePropertyTreeElement(this._parentPane, this._cascade, longhandProperties[i], false, inherited, overloaded);
+            var item = new WebInspector.StylePropertyTreeElement(this._parentPane, this._matchedStyles, longhandProperties[i], false, inherited, overloaded);
             this.appendChild(item);
         }
     },
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css b/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
index ccac694f..e838bc2a 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
@@ -680,6 +680,13 @@
     line-height: 16px;
 }
 
+.sidebar-separator > span.monospace {
+    background: rgb(255, 255, 255);
+    padding: 0px 3px;
+    border-radius: 2px;
+    border: 1px solid #C1C1C1;
+}
+
 .swatch-inner {
     width: 100%;
     height: 100%;
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/module.json b/third_party/WebKit/Source/devtools/front_end/elements/module.json
index f2acb45..11cbdf2 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/elements/module.json
@@ -152,7 +152,6 @@
         "PlatformFontsWidget.js",
         "PropertiesWidget.js",
         "PropertyChangeHighlighter.js",
-        "StylesSectionModel.js",
         "StylesSidebarPane.js",
         "ComputedStyleWidget.js",
         "ElementsPanel.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js
index 71296d75..7a5addac 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js
@@ -139,7 +139,11 @@
             if (error)
                 return null;
 
-            return new WebInspector.CSSStyleModel.MatchedStyleResult(this, nodeId, inlinePayload, attributesPayload, matchedPayload, pseudoPayload, inheritedPayload);
+             var node = this._domModel.nodeForId(nodeId);
+             if (!node)
+                return null;
+
+            return new WebInspector.CSSStyleModel.MatchedStyleResult(this, node, inlinePayload, attributesPayload, matchedPayload, pseudoPayload, inheritedPayload);
         }
 
         return this._agent.getMatchedStylesForNode(nodeId, callback.bind(this));
@@ -2054,18 +2058,17 @@
 /**
  * @constructor
  * @param {!WebInspector.CSSStyleModel} cssModel
- * @param {!DOMAgent.NodeId} nodeId
+ * @param {!WebInspector.DOMNode} node
  * @param {?CSSAgent.CSSStyle=} inlinePayload
  * @param {?CSSAgent.CSSStyle=} attributesPayload
  * @param {!Array.<!CSSAgent.RuleMatch>=} matchedPayload
  * @param {!Array.<!CSSAgent.PseudoElementMatches>=} pseudoPayload
  * @param {!Array.<!CSSAgent.InheritedStyleEntry>=} inheritedPayload
  */
-WebInspector.CSSStyleModel.MatchedStyleResult = function(cssModel, nodeId, inlinePayload, attributesPayload, matchedPayload, pseudoPayload, inheritedPayload)
+WebInspector.CSSStyleModel.MatchedStyleResult = function(cssModel, node, inlinePayload, attributesPayload, matchedPayload, pseudoPayload, inheritedPayload)
 {
     this._cssModel = cssModel;
-    this._node = this._cssModel._domModel.nodeForId(nodeId);
-
+    this._node = node;
     this._nodeStyles = [];
     this._nodeForStyle = new Map();
     this._inheritedStyles = new Set();
@@ -2145,10 +2148,43 @@
             this._pseudoStyles.set(entryPayload.pseudoType, pseudoStyles);
         }
     }
+
+    this.resetActiveProperties();
 }
 
 WebInspector.CSSStyleModel.MatchedStyleResult.prototype = {
     /**
+     * @return {!WebInspector.DOMNode}
+     */
+    node: function()
+    {
+        return this._node;
+    },
+
+    /**
+     * @param {!WebInspector.CSSStyleDeclaration} style
+     * @return {boolean}
+     */
+    hasMatchingSelectors: function(style)
+    {
+        return style.parentRule ? style.parentRule.matchingSelectors && style.parentRule.matchingSelectors.length > 0 && this.mediaMatches(style) : true;
+    },
+
+    /**
+     * @param {!WebInspector.CSSStyleDeclaration} style
+     * @return {boolean}
+     */
+    mediaMatches: function(style)
+    {
+        var media = style.parentRule ? style.parentRule.media : [];
+        for (var i = 0; media && i < media.length; ++i) {
+            if (!media[i].active())
+                return false;
+        }
+        return true;
+    },
+
+    /**
      * @return {!Array<!WebInspector.CSSStyleDeclaration>}
      */
     nodeStyles: function()
@@ -2196,9 +2232,128 @@
     isInherited: function(style)
     {
         return this._inheritedStyles.has(style);
+    },
+
+    /**
+     * @param {!WebInspector.CSSProperty} property
+     * @return {?WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState}
+     */
+    propertyState: function(property)
+    {
+        if (this._propertiesState.size === 0) {
+            this._computeActiveProperties(this._nodeStyles, this._propertiesState);
+            for (var pseudoElementStyles of this._pseudoStyles.valuesArray())
+                this._computeActiveProperties(pseudoElementStyles, this._propertiesState);
+        }
+        return this._propertiesState.get(property) || null;
+    },
+
+    resetActiveProperties: function()
+    {
+        /** @type {!Map<!WebInspector.CSSProperty, !WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState>} */
+        this._propertiesState = new Map();
+    },
+
+    /**
+     * @param {!Array<!WebInspector.CSSStyleDeclaration>} styles
+     * @param {!Map<!WebInspector.CSSProperty, !WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState>} result
+     */
+    _computeActiveProperties: function(styles, result)
+    {
+        /** @type {!Set.<string>} */
+        var foundImportantProperties = new Set();
+        /** @type {!Map.<string, !Map<string, !WebInspector.CSSProperty>>} */
+        var propertyToEffectiveRule = new Map();
+        /** @type {!Map.<string, !WebInspector.DOMNode>} */
+        var inheritedPropertyToNode = new Map();
+        /** @type {!Set<string>} */
+        var allUsedProperties = new Set();
+        for (var i = 0; i < styles.length; ++i) {
+            var style = styles[i];
+            if (!this.hasMatchingSelectors(style))
+                continue;
+
+            /** @type {!Map<string, !WebInspector.CSSProperty>} */
+            var styleActiveProperties = new Map();
+            var allProperties = style.allProperties;
+            for (var j = 0; j < allProperties.length; ++j) {
+                var property = allProperties[j];
+
+                // Do not pick non-inherited properties from inherited styles.
+                var inherited = this.isInherited(style);
+                if (inherited && !WebInspector.CSSMetadata.isPropertyInherited(property.name))
+                    continue;
+
+                if (!property.activeInStyle()) {
+                    result.set(property, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);
+                    continue;
+                }
+
+                var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(property.name);
+                if (foundImportantProperties.has(canonicalName)) {
+                    result.set(property, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);
+                    continue;
+                }
+
+                if (!property.important && allUsedProperties.has(canonicalName)) {
+                    result.set(property, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);
+                    continue;
+                }
+
+                var isKnownProperty = propertyToEffectiveRule.has(canonicalName);
+                var inheritedFromNode = inherited ? this.nodeForStyle(style) : null;
+                if (!isKnownProperty && inheritedFromNode && !inheritedPropertyToNode.has(canonicalName))
+                    inheritedPropertyToNode.set(canonicalName, inheritedFromNode);
+
+                if (property.important) {
+                    if (inherited && isKnownProperty && inheritedFromNode !== inheritedPropertyToNode.get(canonicalName)) {
+                        result.set(property, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);
+                        continue;
+                    }
+
+                    foundImportantProperties.add(canonicalName);
+                    if (isKnownProperty) {
+                        var overloaded = /** @type {!WebInspector.CSSProperty} */(propertyToEffectiveRule.get(canonicalName).get(canonicalName));
+                        result.set(overloaded, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);
+                        propertyToEffectiveRule.get(canonicalName).delete(canonicalName);
+                    }
+                }
+
+                styleActiveProperties.set(canonicalName, property);
+                allUsedProperties.add(canonicalName);
+                propertyToEffectiveRule.set(canonicalName, styleActiveProperties);
+                result.set(property, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Active);
+            }
+
+            // If every longhand of the shorthand is not active, then the shorthand is not active too.
+            for (var property of style.leadingProperties()) {
+                var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(property.name);
+                if (!styleActiveProperties.has(canonicalName))
+                    continue;
+                var longhands = style.longhandProperties(property.name);
+                if (!longhands.length)
+                    continue;
+                var notUsed = true;
+                for (var longhand of longhands) {
+                    var longhandCanonicalName = WebInspector.CSSMetadata.canonicalPropertyName(longhand.name);
+                    notUsed = notUsed && !styleActiveProperties.has(longhandCanonicalName);
+                }
+                if (!notUsed)
+                    continue;
+                styleActiveProperties.delete(canonicalName);
+                allUsedProperties.delete(canonicalName);
+                result.set(property, WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState.Overloaded);
+            }
+        }
     }
 }
 
+/** @enum {string} */
+WebInspector.CSSStyleModel.MatchedStyleResult.PropertyState = {
+    Active: "Active",
+    Overloaded: "Overloaded"
+}
+
 /**
  * @constructor
  * @param {?WebInspector.CSSStyleDeclaration} inlineStyle
diff --git a/third_party/WebKit/Source/devtools/protocol.json b/third_party/WebKit/Source/devtools/protocol.json
index 47d4bac..099a0fa 100644
--- a/third_party/WebKit/Source/devtools/protocol.json
+++ b/third_party/WebKit/Source/devtools/protocol.json
@@ -5164,6 +5164,13 @@
                     { "name": "animation", "$ref": "Animation", "description": "Animation that was started." }
                 ],
                 "description": "Event for animation that has been started."
+            },
+            {
+                "name": "animationCanceled",
+                "parameters": [
+                    { "name": "id", "type": "string", "description": "Id of the animation that was cancelled."}
+                ],
+                "description": "Event for when an animation has been cancelled."
             }
         ]
     },
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncEvent.cpp b/third_party/WebKit/Source/modules/background_sync/SyncEvent.cpp
index a3dbf86..b109a111 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncEvent.cpp
+++ b/third_party/WebKit/Source/modules/background_sync/SyncEvent.cpp
@@ -11,9 +11,10 @@
 {
 }
 
-SyncEvent::SyncEvent(const AtomicString& type, SyncRegistration* syncRegistration, WaitUntilObserver* observer)
+SyncEvent::SyncEvent(const AtomicString& type, SyncRegistration* syncRegistration, bool lastChance, WaitUntilObserver* observer)
     : ExtendableEvent(type, ExtendableEventInit(), observer)
     , m_syncRegistration(syncRegistration)
+    , m_lastChance(lastChance)
 {
 }
 
@@ -21,6 +22,7 @@
     : ExtendableEvent(type, init)
 {
     m_syncRegistration = init.registration();
+    m_lastChance = init.lastChance();
 }
 
 SyncEvent::~SyncEvent()
@@ -37,6 +39,11 @@
     return m_syncRegistration.get();
 }
 
+bool SyncEvent::lastChance()
+{
+    return m_lastChance;
+}
+
 DEFINE_TRACE(SyncEvent)
 {
     visitor->trace(m_syncRegistration);
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncEvent.h b/third_party/WebKit/Source/modules/background_sync/SyncEvent.h
index ab125ef..d5b8665 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncEvent.h
+++ b/third_party/WebKit/Source/modules/background_sync/SyncEvent.h
@@ -22,9 +22,9 @@
     {
         return adoptRefWillBeNoop(new SyncEvent);
     }
-    static PassRefPtrWillBeRawPtr<SyncEvent> create(const AtomicString& type, SyncRegistration* syncRegistration, WaitUntilObserver* observer)
+    static PassRefPtrWillBeRawPtr<SyncEvent> create(const AtomicString& type, SyncRegistration* syncRegistration, bool lastChance, WaitUntilObserver* observer)
     {
-        return adoptRefWillBeNoop(new SyncEvent(type, syncRegistration, observer));
+        return adoptRefWillBeNoop(new SyncEvent(type, syncRegistration, lastChance, observer));
     }
     static PassRefPtrWillBeRawPtr<SyncEvent> create(const AtomicString& type, const SyncEventInit& init)
     {
@@ -36,15 +36,17 @@
     const AtomicString& interfaceName() const override;
 
     SyncRegistration* registration();
+    bool lastChance();
 
     DECLARE_VIRTUAL_TRACE();
 
 private:
     SyncEvent();
-    SyncEvent(const AtomicString& type, SyncRegistration*, WaitUntilObserver*);
+    SyncEvent(const AtomicString& type, SyncRegistration*, bool, WaitUntilObserver*);
     SyncEvent(const AtomicString& type, const SyncEventInit&);
 
     PersistentWillBeMember<SyncRegistration> m_syncRegistration;
+    bool m_lastChance;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncEvent.idl b/third_party/WebKit/Source/modules/background_sync/SyncEvent.idl
index ae8a874..f828e499 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncEvent.idl
+++ b/third_party/WebKit/Source/modules/background_sync/SyncEvent.idl
@@ -8,4 +8,5 @@
     RuntimeEnabled=BackgroundSync,
 ] interface SyncEvent : ExtendableEvent {
     readonly attribute SyncRegistration registration;
+    readonly attribute boolean lastChance;
 };
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncEventInit.idl b/third_party/WebKit/Source/modules/background_sync/SyncEventInit.idl
index a7d2f51..df44f64 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncEventInit.idl
+++ b/third_party/WebKit/Source/modules/background_sync/SyncEventInit.idl
@@ -4,4 +4,5 @@
 
 dictionary SyncEventInit : ExtendableEventInit {
     required SyncRegistration registration;
+    required boolean lastChance;
 };
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
index 011ddad..22c4148e 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
@@ -45,17 +45,20 @@
 const AtomicString& connectionStateToString(WebPresentationConnectionState state)
 {
     DEFINE_STATIC_LOCAL(const AtomicString, connectedValue, ("connected", AtomicString::ConstructFromLiteral));
-    DEFINE_STATIC_LOCAL(const AtomicString, disconnectedValue, ("disconnected", AtomicString::ConstructFromLiteral));
+    DEFINE_STATIC_LOCAL(const AtomicString, closedValue, ("closed", AtomicString::ConstructFromLiteral));
+    DEFINE_STATIC_LOCAL(const AtomicString, terminatedValue, ("terminated", AtomicString::ConstructFromLiteral));
 
     switch (state) {
     case WebPresentationConnectionState::Connected:
         return connectedValue;
-    case WebPresentationConnectionState::Disconnected:
-        return disconnectedValue;
+    case WebPresentationConnectionState::Closed:
+        return closedValue;
+    case WebPresentationConnectionState::Terminated:
+        return terminatedValue;
     }
 
     ASSERT_NOT_REACHED();
-    return disconnectedValue;
+    return terminatedValue;
 }
 
 void throwPresentationDisconnectedError(ExceptionState& exceptionState)
@@ -223,7 +226,7 @@
 
 bool PresentationConnection::canSendMessage(ExceptionState& exceptionState)
 {
-    if (m_state == WebPresentationConnectionState::Disconnected) {
+    if (m_state != WebPresentationConnectionState::Connected) {
         throwPresentationDisconnectedError(exceptionState);
         return false;
     }
@@ -284,7 +287,7 @@
 
 void PresentationConnection::didReceiveTextMessage(const String& message)
 {
-    if (m_state == WebPresentationConnectionState::Disconnected)
+    if (m_state != WebPresentationConnectionState::Connected)
         return;
 
     dispatchEvent(MessageEvent::create(message));
@@ -292,7 +295,7 @@
 
 void PresentationConnection::didReceiveBinaryMessage(const uint8_t* data, size_t length)
 {
-    if (m_state == WebPresentationConnectionState::Disconnected)
+    if (m_state != WebPresentationConnectionState::Connected)
         return;
 
     switch (m_binaryType) {
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnection.idl b/third_party/WebKit/Source/modules/presentation/PresentationConnection.idl
index 39b7e96..1e1d50c 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationConnection.idl
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnection.idl
@@ -6,7 +6,8 @@
 
 enum PresentationConnectionState {
     "connected",
-    "disconnected"
+    "closed",
+    "terminated"
 };
 
 [
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.cpp b/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.cpp
index 7196de5a0..af55920 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.cpp
@@ -118,6 +118,31 @@
     return s + "(" + args + ")";
 }
 
+AudioParamTimeline::ParamEvent AudioParamTimeline::ParamEvent::createSetValueEvent(float value, double time)
+{
+    return ParamEvent(ParamEvent::SetValue, value, time, 0, 0, nullptr);
+}
+
+AudioParamTimeline::ParamEvent AudioParamTimeline::ParamEvent::createLinearRampEvent(float value, double time)
+{
+    return ParamEvent(ParamEvent::LinearRampToValue, value, time, 0, 0, nullptr);
+}
+
+AudioParamTimeline::ParamEvent AudioParamTimeline::ParamEvent::createExponentialRampEvent(float value, double time)
+{
+    return ParamEvent(ParamEvent::ExponentialRampToValue, value, time, 0, 0, nullptr);
+}
+
+AudioParamTimeline::ParamEvent AudioParamTimeline::ParamEvent::createSetTargetEvent(float value, double time, double timeConstant)
+{
+    return ParamEvent(ParamEvent::SetTarget, value, time, timeConstant, 0, nullptr);
+}
+
+AudioParamTimeline::ParamEvent AudioParamTimeline::ParamEvent::createSetValueCurveEvent(DOMFloat32Array* curve, double time, double duration)
+{
+    return ParamEvent(ParamEvent::SetValueCurve, 0, time, 0, duration, curve);
+}
+
 void AudioParamTimeline::setValueAtTime(float value, double time, ExceptionState& exceptionState)
 {
     ASSERT(isMainThread());
@@ -125,7 +150,7 @@
     if (!isNonNegativeAudioParamTime(time, exceptionState))
         return;
 
-    insertEvent(ParamEvent(ParamEvent::SetValue, value, time, 0, 0, nullptr), exceptionState);
+    insertEvent(ParamEvent::createSetValueEvent(value, time), exceptionState);
 }
 
 void AudioParamTimeline::linearRampToValueAtTime(float value, double time, ExceptionState& exceptionState)
@@ -135,7 +160,7 @@
     if (!isNonNegativeAudioParamTime(time, exceptionState))
         return;
 
-    insertEvent(ParamEvent(ParamEvent::LinearRampToValue, value, time, 0, 0, nullptr), exceptionState);
+    insertEvent(ParamEvent::createLinearRampEvent(value, time), exceptionState);
 }
 
 void AudioParamTimeline::exponentialRampToValueAtTime(float value, double time, ExceptionState& exceptionState)
@@ -146,7 +171,7 @@
         || !isNonNegativeAudioParamTime(time, exceptionState))
         return;
 
-    insertEvent(ParamEvent(ParamEvent::ExponentialRampToValue, value, time, 0, 0, nullptr), exceptionState);
+    insertEvent(ParamEvent::createExponentialRampEvent(value, time), exceptionState);
 }
 
 void AudioParamTimeline::setTargetAtTime(float target, double time, double timeConstant, ExceptionState& exceptionState)
@@ -157,7 +182,7 @@
         || !isNonNegativeAudioParamTime(timeConstant, exceptionState, "Time constant"))
         return;
 
-    insertEvent(ParamEvent(ParamEvent::SetTarget, target, time, timeConstant, 0, nullptr), exceptionState);
+    insertEvent(ParamEvent::createSetTargetEvent(target, time, timeConstant), exceptionState);
 }
 
 void AudioParamTimeline::setValueCurveAtTime(DOMFloat32Array* curve, double time, double duration, ExceptionState& exceptionState)
@@ -168,7 +193,7 @@
         || !isPositiveAudioParamTime(duration, exceptionState, "Duration"))
         return;
 
-    insertEvent(ParamEvent(ParamEvent::SetValueCurve, 0, time, 0, duration, curve), exceptionState);
+    insertEvent(ParamEvent::createSetValueCurveEvent(curve, time, duration), exceptionState);
 }
 
 void AudioParamTimeline::insertEvent(const ParamEvent& event, ExceptionState& exceptionState)
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h b/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h
index 06c2fa22..7e34619 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h
@@ -78,6 +78,20 @@
             LastType
         };
 
+        static ParamEvent createLinearRampEvent(float value, double time);
+        static ParamEvent createExponentialRampEvent(float value, double time);
+        static ParamEvent createSetValueEvent(float value, double time);
+        static ParamEvent createSetTargetEvent(float value, double time, double timeConstant);
+        static ParamEvent createSetValueCurveEvent(DOMFloat32Array* curve, double time, double duration);
+
+        Type type() const { return m_type; }
+        float value() const { return m_value; }
+        double time() const { return m_time; }
+        double timeConstant() const { return m_timeConstant; }
+        double duration() const { return m_duration; }
+        DOMFloat32Array* curve() { return m_curve.get(); }
+
+    private:
         ParamEvent(Type type, float value, double time, double timeConstant, double duration, PassRefPtr<DOMFloat32Array> curve)
             : m_type(type)
             , m_value(value)
@@ -88,18 +102,12 @@
         {
         }
 
-        Type type() const { return m_type; }
-        float value() const { return m_value; }
-        double time() const { return m_time; }
-        double timeConstant() const { return m_timeConstant; }
-        double duration() const { return m_duration; }
-        DOMFloat32Array* curve() { return m_curve.get(); }
-
-    private:
         Type m_type;
         float m_value;
         double m_time;
+        // Only used for SetTarget events
         double m_timeConstant;
+        // Only used for SetValueCurve events.
         double m_duration;
         RefPtr<DOMFloat32Array> m_curve;
     };
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
index 112fc98..a11c895 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp
@@ -27,6 +27,7 @@
 #include "modules/webaudio/BiquadDSPKernel.h"
 
 #include "platform/FloatConversion.h"
+#include "platform/audio/AudioUtilities.h"
 #include "wtf/Vector.h"
 #include <limits.h>
 
@@ -38,73 +39,79 @@
 // settings of the Biquad.
 static const double MaxBiquadDelayTime = 0.2;
 
-void BiquadDSPKernel::updateCoefficientsIfNecessary()
+void BiquadDSPKernel::updateCoefficientsIfNecessary(int framesToProcess)
 {
     if (biquadProcessor()->filterCoefficientsDirty()) {
-        double cutoffFrequency;
-        double Q;
-        double gain;
-        double detune; // in Cents
+        float cutoffFrequency[AudioUtilities::kRenderQuantumFrames];
+        float Q[AudioUtilities::kRenderQuantumFrames];
+        float gain[AudioUtilities::kRenderQuantumFrames];
+        float detune[AudioUtilities::kRenderQuantumFrames]; // in Cents
 
         if (biquadProcessor()->hasSampleAccurateValues()) {
-            cutoffFrequency = biquadProcessor()->parameter1().finalValue();
-            Q = biquadProcessor()->parameter2().finalValue();
-            gain = biquadProcessor()->parameter3().finalValue();
-            detune = biquadProcessor()->parameter4().finalValue();
+            biquadProcessor()->parameter1().calculateSampleAccurateValues(cutoffFrequency, framesToProcess);
+            biquadProcessor()->parameter2().calculateSampleAccurateValues(Q, framesToProcess);
+            biquadProcessor()->parameter3().calculateSampleAccurateValues(gain, framesToProcess);
+            biquadProcessor()->parameter4().calculateSampleAccurateValues(detune, framesToProcess);
+            updateCoefficients(framesToProcess, cutoffFrequency, Q, gain, detune);
         } else {
-            cutoffFrequency = biquadProcessor()->parameter1().smoothedValue();
-            Q = biquadProcessor()->parameter2().smoothedValue();
-            gain = biquadProcessor()->parameter3().smoothedValue();
-            detune = biquadProcessor()->parameter4().smoothedValue();
+            cutoffFrequency[0] = biquadProcessor()->parameter1().smoothedValue();
+            Q[0] = biquadProcessor()->parameter2().smoothedValue();
+            gain[0] = biquadProcessor()->parameter3().smoothedValue();
+            detune[0] = biquadProcessor()->parameter4().smoothedValue();
+            updateCoefficients(1, cutoffFrequency, Q, gain, detune);
         }
-
-        updateCoefficients(cutoffFrequency, Q, gain, detune);
     }
 }
 
-void BiquadDSPKernel::updateCoefficients(double cutoffFrequency, double Q, double gain, double detune)
+void BiquadDSPKernel::updateCoefficients(int numberOfFrames, const float* cutoffFrequency, const float* Q, const float* gain, const float* detune)
 {
     // Convert from Hertz to normalized frequency 0 -> 1.
     double nyquist = this->nyquist();
-    double normalizedFrequency = cutoffFrequency / nyquist;
 
-    // Offset frequency by detune.
-    if (detune)
-        normalizedFrequency *= pow(2, detune / 1200);
 
-    // Configure the biquad with the new filter parameters for the appropriate type of filter.
-    switch (biquadProcessor()->type()) {
-    case BiquadProcessor::LowPass:
-        m_biquad.setLowpassParams(normalizedFrequency, Q);
-        break;
+    m_biquad.setHasSampleAccurateValues(numberOfFrames > 1);
 
-    case BiquadProcessor::HighPass:
-        m_biquad.setHighpassParams(normalizedFrequency, Q);
-        break;
+    for (int k = 0; k < numberOfFrames; ++k) {
+        double normalizedFrequency = cutoffFrequency[k] / nyquist;
 
-    case BiquadProcessor::BandPass:
-        m_biquad.setBandpassParams(normalizedFrequency, Q);
-        break;
+        // Offset frequency by detune.
+        if (detune[k])
+            normalizedFrequency *= pow(2, detune[k] / 1200);
 
-    case BiquadProcessor::LowShelf:
-        m_biquad.setLowShelfParams(normalizedFrequency, gain);
-        break;
+        // Configure the biquad with the new filter parameters for the appropriate type of filter.
+        switch (biquadProcessor()->type()) {
+        case BiquadProcessor::LowPass:
+            m_biquad.setLowpassParams(k, normalizedFrequency, Q[k]);
+            break;
 
-    case BiquadProcessor::HighShelf:
-        m_biquad.setHighShelfParams(normalizedFrequency, gain);
-        break;
+        case BiquadProcessor::HighPass:
+            m_biquad.setHighpassParams(k, normalizedFrequency, Q[k]);
+            break;
 
-    case BiquadProcessor::Peaking:
-        m_biquad.setPeakingParams(normalizedFrequency, Q, gain);
-        break;
+        case BiquadProcessor::BandPass:
+            m_biquad.setBandpassParams(k, normalizedFrequency, Q[k]);
+            break;
 
-    case BiquadProcessor::Notch:
-        m_biquad.setNotchParams(normalizedFrequency, Q);
-        break;
+        case BiquadProcessor::LowShelf:
+            m_biquad.setLowShelfParams(k, normalizedFrequency, gain[k]);
+            break;
 
-    case BiquadProcessor::Allpass:
-        m_biquad.setAllpassParams(normalizedFrequency, Q);
-        break;
+        case BiquadProcessor::HighShelf:
+            m_biquad.setHighShelfParams(k, normalizedFrequency, gain[k]);
+            break;
+
+        case BiquadProcessor::Peaking:
+            m_biquad.setPeakingParams(k, normalizedFrequency, Q[k], gain[k]);
+            break;
+
+        case BiquadProcessor::Notch:
+            m_biquad.setNotchParams(k, normalizedFrequency, Q[k]);
+            break;
+
+        case BiquadProcessor::Allpass:
+            m_biquad.setAllpassParams(k, normalizedFrequency, Q[k]);
+            break;
+        }
     }
 }
 
@@ -124,7 +131,7 @@
     {
         MutexTryLocker tryLocker(m_processLock);
         if (tryLocker.locked())
-            updateCoefficientsIfNecessary();
+            updateCoefficientsIfNecessary(framesToProcess);
     }
 
     m_biquad.process(source, destination, framesToProcess);
@@ -146,10 +153,10 @@
     for (int k = 0; k < nFrequencies; ++k)
         frequency[k] = narrowPrecisionToFloat(frequencyHz[k] / nyquist);
 
-    double cutoffFrequency;
-    double Q;
-    double gain;
-    double detune; // in Cents
+    float cutoffFrequency;
+    float Q;
+    float gain;
+    float detune; // in Cents
 
     {
         // Get a copy of the current biquad filter coefficients so we can update the biquad with
@@ -172,7 +179,7 @@
         detune = biquadProcessor()->parameter4().value();
     }
 
-    updateCoefficients(cutoffFrequency, Q, gain, detune);
+    updateCoefficients(1, &cutoffFrequency, &Q, &gain, &detune);
 
     m_biquad.getFrequencyResponse(nFrequencies, frequency.data(), magResponse, phaseResponse);
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
index fff8fa9..971ef5e 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.h
@@ -59,9 +59,9 @@
 
     // To prevent audio glitches when parameters are changed,
     // dezippering is used to slowly change the parameters.
-    void updateCoefficientsIfNecessary();
+    void updateCoefficientsIfNecessary(int);
     // Update the biquad cofficients with the given parameters
-    void updateCoefficients(double frequency, double Q, double gain, double detune);
+    void updateCoefficients(int, const float* frequency, const float* Q, const float* gain, const float* detune);
 
 private:
     // Synchronize process() with getting and setting the filter coefficients.
diff --git a/third_party/WebKit/Source/platform/LengthBox.cpp b/third_party/WebKit/Source/platform/LengthBox.cpp
index 071d67b..036c2c8 100644
--- a/third_party/WebKit/Source/platform/LengthBox.cpp
+++ b/third_party/WebKit/Source/platform/LengthBox.cpp
@@ -85,4 +85,14 @@
     return isLeftToRightDirection(direction) ? m_bottom : m_top;
 }
 
+const Length& LengthBox::over(WritingMode writingMode) const
+{
+    return isHorizontalWritingMode(writingMode) ? m_top : m_right;
+}
+
+const Length& LengthBox::under(WritingMode writingMode) const
+{
+    return isHorizontalWritingMode(writingMode) ? m_bottom : m_left;
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/LengthBox.h b/third_party/WebKit/Source/platform/LengthBox.h
index 400a6b8..952734b 100644
--- a/third_party/WebKit/Source/platform/LengthBox.h
+++ b/third_party/WebKit/Source/platform/LengthBox.h
@@ -79,6 +79,8 @@
     const Length& after(WritingMode) const;
     const Length& start(WritingMode, TextDirection) const;
     const Length& end(WritingMode, TextDirection) const;
+    const Length& over(WritingMode) const;
+    const Length& under(WritingMode) const;
 
     bool operator==(const LengthBox& o) const
     {
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
index 71ff2dc..05abb9b 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -165,7 +165,7 @@
 SlimmingPaintV2
 SlimmingPaintOffsetCaching implied_by=SlimmingPaintV2
 SlimmingPaintStrictCullRectClipping
-SlimmingPaintSynchronizedPainting implied_by=SlimmingPaintV2, status=stable
+SlimmingPaintSynchronizedPainting implied_by=SlimmingPaintV2
 SlimmingPaintUnderInvalidationChecking
 StackedCSSPropertyAnimations status=experimental
 StyleSharing status=stable
diff --git a/third_party/WebKit/Source/platform/TraceEventCommon.h b/third_party/WebKit/Source/platform/TraceEventCommon.h
index aa5a493..136fbe37 100644
--- a/third_party/WebKit/Source/platform/TraceEventCommon.h
+++ b/third_party/WebKit/Source/platform/TraceEventCommon.h
@@ -403,14 +403,12 @@
                            TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val,   \
                            arg2_name, arg2_val)
 
-#define TRACE_EVENT_MARK(category_group, name)                           \
-  INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \
-                           TRACE_EVENT_FLAG_NONE)
-
-#define TRACE_EVENT_MARK_WITH_TIMESTAMP(category_group, name, timestamp)   \
+#define TRACE_EVENT_MARK_WITH_TIMESTAMP1(category_group, name, timestamp,  \
+                                         arg1_name, arg1_val)              \
   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(TRACE_EVENT_PHASE_MARK,          \
                                           category_group, name, timestamp, \
-                                          TRACE_EVENT_FLAG_NONE)
+                                          TRACE_EVENT_FLAG_NONE,           \
+                                          arg1_name, arg1_val)
 
 #define TRACE_EVENT_COPY_MARK(category_group, name)                      \
   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \
diff --git a/third_party/WebKit/Source/platform/audio/AudioUtilities.h b/third_party/WebKit/Source/platform/audio/AudioUtilities.h
index 6e0d9cb..68bf2a3 100644
--- a/third_party/WebKit/Source/platform/audio/AudioUtilities.h
+++ b/third_party/WebKit/Source/platform/audio/AudioUtilities.h
@@ -31,6 +31,10 @@
 namespace blink {
 namespace AudioUtilities {
 
+// Rendering quantum size.  This is how many frames are processed at a time for each node in the
+// audio graph.
+static const unsigned kRenderQuantumFrames = 128;
+
 // Standard functions for converting to and from decibel values from linear.
 PLATFORM_EXPORT float linearToDecibels(float);
 PLATFORM_EXPORT float decibelsToLinear(float);
diff --git a/third_party/WebKit/Source/platform/audio/Biquad.cpp b/third_party/WebKit/Source/platform/audio/Biquad.cpp
index e614c7c..9fb50056 100644
--- a/third_party/WebKit/Source/platform/audio/Biquad.cpp
+++ b/third_party/WebKit/Source/platform/audio/Biquad.cpp
@@ -32,11 +32,13 @@
 
 #include "platform/audio/Biquad.h"
 
-#include <stdio.h>
-#include <algorithm>
+#include "platform/audio/AudioUtilities.h"
 #include "platform/audio/DenormalDisabler.h"
 #include "wtf/MathExtras.h"
 
+#include <algorithm>
+#include <stdio.h>
+
 #if OS(MACOSX)
 #include <Accelerate/Accelerate.h>
 #endif
@@ -48,6 +50,7 @@
 #endif
 
 Biquad::Biquad()
+    : m_hasSampleAccurateValues(false)
 {
 #if OS(MACOSX)
     // Allocate two samples more for filter history
@@ -61,8 +64,16 @@
     m_ippInternalBuffer = ippsMalloc_8u(bufferSize);
 #endif // USE(WEBAUDIO_IPP)
 
+    // Allocate enough space for the a-rate filter coefficients to handle a rendering quantum of 128
+    // frames.
+    m_b0.allocate(AudioUtilities::kRenderQuantumFrames);
+    m_b1.allocate(AudioUtilities::kRenderQuantumFrames);
+    m_b2.allocate(AudioUtilities::kRenderQuantumFrames);
+    m_a1.allocate(AudioUtilities::kRenderQuantumFrames);
+    m_a2.allocate(AudioUtilities::kRenderQuantumFrames);
+
     // Initialize as pass-thru (straight-wire, no filter effect)
-    setNormalizedCoefficients(1, 0, 0, 1, 0, 0);
+    setNormalizedCoefficients(0, 1, 0, 0, 1, 0, 0);
 
     reset(); // clear filter memory
 }
@@ -76,55 +87,111 @@
 
 void Biquad::process(const float* sourceP, float* destP, size_t framesToProcess)
 {
+    if (hasSampleAccurateValues()) {
+        int n = framesToProcess;
+
+        // Create local copies of member variables
+        double x1 = m_x1;
+        double x2 = m_x2;
+        double y1 = m_y1;
+        double y2 = m_y2;
+
+        const double* b0 = m_b0.data();
+        const double* b1 = m_b1.data();
+        const double* b2 = m_b2.data();
+        const double* a1 = m_a1.data();
+        const double* a2 = m_a2.data();
+
+        for (int k = 0; k < n; ++k) {
+            // FIXME: this can be optimized by pipelining the multiply adds...
+            float x = *sourceP++;
+            float y = b0[k]*x + b1[k]*x1 + b2[k]*x2 - a1[k]*y1 - a2[k]*y2;
+
+            *destP++ = y;
+
+            // Update state variables
+            x2 = x1;
+            x1 = x;
+            y2 = y1;
+            y1 = y;
+        }
+
+        // Local variables back to member. Flush denormals here so we
+        // don't slow down the inner loop above.
+        m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1);
+        m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2);
+        m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1);
+        m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2);
+
+        // There is an assumption here that once we have sample accurate values we can never go back
+        // to not having sample accurate values.  This is currently true in the way
+        // AudioParamTimline is implemented: once an event is inserted, sample accurate processing
+        // is always enabled.
+        //
+        // If so, then we never have to update the state variables for the MACOSX or WEBAUDIO_IPP
+        // path.  The structure of the state variable in these cases aren't well documented so it's
+        // not clear how to update them anyway.
+    } else {
 #if OS(MACOSX)
-    // Use vecLib if available
-    processFast(sourceP, destP, framesToProcess);
+        // Use vecLib if available
+        processFast(sourceP, destP, framesToProcess);
+
+        // Copy the last inputs and outputs to the filter memory variables.  This is needed because
+        // the next rendering quantum might be an automation which needs the history to continue
+        // correctly.
+        m_x1 = sourceP[framesToProcess - 1];
+        m_x2 = sourceP[framesToProcess - 2];
+        m_y1 = destP[framesToProcess - 1];
+        m_y2 = destP[framesToProcess - 2];
 
 #elif USE(WEBAUDIO_IPP)
-    ippsIIR64f_32f(sourceP, destP, static_cast<int>(framesToProcess), m_biquadState);
+        ippsIIR64f_32f(sourceP, destP, static_cast<int>(framesToProcess), m_biquadState);
+
+        // Copy the last inputs and outputs to the filter memory variables.  This is needed because
+        // the next rendering quantum might be an automation which needs the history to continue
+        // correctly.
+        m_x1 = sourceP[framesToProcess - 1];
+        m_x2 = sourceP[framesToProcess - 2];
+        m_y1 = destP[framesToProcess - 1];
+        m_y2 = destP[framesToProcess - 2];
 #else // USE(WEBAUDIO_IPP)
 
-    int n = framesToProcess;
+        int n = framesToProcess;
 
-    // Create local copies of member variables
-    double x1 = m_x1;
-    double x2 = m_x2;
-    double y1 = m_y1;
-    double y2 = m_y2;
+        // Create local copies of member variables
+        double x1 = m_x1;
+        double x2 = m_x2;
+        double y1 = m_y1;
+        double y2 = m_y2;
 
-    double b0 = m_b0;
-    double b1 = m_b1;
-    double b2 = m_b2;
-    double a1 = m_a1;
-    double a2 = m_a2;
+        double b0 = m_b0[0];
+        double b1 = m_b1[0];
+        double b2 = m_b2[0];
+        double a1 = m_a1[0];
+        double a2 = m_a2[0];
 
-    while (n--) {
-        // FIXME: this can be optimized by pipelining the multiply adds...
-        float x = *sourceP++;
-        float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
+        while (n--) {
+            // FIXME: this can be optimized by pipelining the multiply adds...
+            float x = *sourceP++;
+            float y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
 
-        *destP++ = y;
+            *destP++ = y;
 
-        // Update state variables
-        x2 = x1;
-        x1 = x;
-        y2 = y1;
-        y1 = y;
-    }
+            // Update state variables
+            x2 = x1;
+            x1 = x;
+            y2 = y1;
+            y1 = y;
+        }
 
-    // Local variables back to member. Flush denormals here so we
-    // don't slow down the inner loop above.
-    m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1);
-    m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2);
-    m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1);
-    m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2);
-
-    m_b0 = b0;
-    m_b1 = b1;
-    m_b2 = b2;
-    m_a1 = a1;
-    m_a2 = a2;
+        // Local variables back to member. Flush denormals here so we
+        // don't slow down the inner loop above.
+        m_x1 = DenormalDisabler::flushDenormalFloatToZero(x1);
+        m_x2 = DenormalDisabler::flushDenormalFloatToZero(x2);
+        m_y1 = DenormalDisabler::flushDenormalFloatToZero(y1);
+        m_y2 = DenormalDisabler::flushDenormalFloatToZero(y2);
 #endif
+    }
 }
 
 #if OS(MACOSX)
@@ -134,11 +201,11 @@
 void Biquad::processFast(const float* sourceP, float* destP, size_t framesToProcess)
 {
     double filterCoefficients[5];
-    filterCoefficients[0] = m_b0;
-    filterCoefficients[1] = m_b1;
-    filterCoefficients[2] = m_b2;
-    filterCoefficients[3] = m_a1;
-    filterCoefficients[4] = m_a2;
+    filterCoefficients[0] = m_b0[0];
+    filterCoefficients[1] = m_b1[0];
+    filterCoefficients[2] = m_b2[0];
+    filterCoefficients[3] = m_a1[0];
+    filterCoefficients[4] = m_a2[0];
 
     double* inputP = m_inputBuffer.data();
     double* outputP = m_outputBuffer.data();
@@ -201,20 +268,20 @@
     ippsIIRGetStateSize64f_BiQuad_32f(1, &bufferSize);
     ippsZero_8u(m_ippInternalBuffer, bufferSize);
 
-#else
-    m_x1 = m_x2 = m_y1 = m_y2 = 0;
 #endif
+    m_x1 = m_x2 = m_y1 = m_y2 = 0;
 }
 
-void Biquad::setLowpassParams(double cutoff, double resonance)
+void Biquad::setLowpassParams(int index, double cutoff, double resonance)
 {
     // Limit cutoff to 0 to 1.
     cutoff = std::max(0.0, std::min(cutoff, 1.0));
 
     if (cutoff == 1) {
         // When cutoff is 1, the z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     } else if (cutoff > 0) {
         // Compute biquad coefficients for lowpass filter
         resonance = std::max(0.0, resonance); // can't go negative
@@ -233,24 +300,26 @@
         double a1 = 2 * -gamma;
         double a2 = 2 * beta;
 
-        setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
+        setNormalizedCoefficients(index, b0, b1, b2, 1, a1, a2);
     } else {
         // When cutoff is zero, nothing gets through the filter, so set
         // coefficients up correctly.
-        setNormalizedCoefficients(0, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            0, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setHighpassParams(double cutoff, double resonance)
+void Biquad::setHighpassParams(int index, double cutoff, double resonance)
 {
     // Limit cutoff to 0 to 1.
     cutoff = std::max(0.0, std::min(cutoff, 1.0));
 
     if (cutoff == 1) {
         // The z-transform is 0.
-        setNormalizedCoefficients(0, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            0, 0, 0,
+            1, 0, 0);
     } else if (cutoff > 0) {
         // Compute biquad coefficients for highpass filter
         resonance = std::max(0.0, resonance); // can't go negative
@@ -269,42 +338,43 @@
         double a1 = 2 * -gamma;
         double a2 = 2 * beta;
 
-        setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
+        setNormalizedCoefficients(index, b0, b1, b2, 1, a1, a2);
     } else {
-      // When cutoff is zero, we need to be careful because the above
-      // gives a quadratic divided by the same quadratic, with poles
-      // and zeros on the unit circle in the same place. When cutoff
-      // is zero, the z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        // When cutoff is zero, we need to be careful because the above
+        // gives a quadratic divided by the same quadratic, with poles
+        // and zeros on the unit circle in the same place. When cutoff
+        // is zero, the z-transform is 1.
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setNormalizedCoefficients(double b0, double b1, double b2, double a0, double a1, double a2)
+void Biquad::setNormalizedCoefficients(int index, double b0, double b1, double b2, double a0, double a1, double a2)
 {
     double a0Inverse = 1 / a0;
 
-    m_b0 = b0 * a0Inverse;
-    m_b1 = b1 * a0Inverse;
-    m_b2 = b2 * a0Inverse;
-    m_a1 = a1 * a0Inverse;
-    m_a2 = a2 * a0Inverse;
+    m_b0[index] = b0 * a0Inverse;
+    m_b1[index] = b1 * a0Inverse;
+    m_b2[index] = b2 * a0Inverse;
+    m_a1[index] = a1 * a0Inverse;
+    m_a2[index] = a2 * a0Inverse;
 
 #if USE(WEBAUDIO_IPP)
     Ipp64f taps[6];
-    taps[0] = m_b0;
-    taps[1] = m_b1;
-    taps[2] = m_b2;
+    taps[0] = m_b0[0];
+    taps[1] = m_b1[0];
+    taps[2] = m_b2[0];
     taps[3] = 1;
-    taps[4] = m_a1;
-    taps[5] = m_a2;
+    taps[4] = m_a1[0];
+    taps[5] = m_a2[0];
     m_biquadState = 0;
 
     ippsIIRInit64f_BiQuad_32f(&m_biquadState, taps, 1, 0, m_ippInternalBuffer);
 #endif // USE(WEBAUDIO_IPP)
 }
 
-void Biquad::setLowShelfParams(double frequency, double dbGain)
+void Biquad::setLowShelfParams(int index, double frequency, double dbGain)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -313,8 +383,9 @@
 
     if (frequency == 1) {
         // The z-transform is a constant gain.
-        setNormalizedCoefficients(A * A, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            A * A, 0, 0,
+            1, 0, 0);
     } else if (frequency > 0) {
         double w0 = piDouble * frequency;
         double S = 1; // filter slope (1 is max value)
@@ -331,15 +402,16 @@
         double a1 = -2 * (aMinusOne + aPlusOne * k);
         double a2 = aPlusOne + aMinusOne * k - k2;
 
-        setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+        setNormalizedCoefficients(index, b0, b1, b2, a0, a1, a2);
     } else {
         // When frequency is 0, the z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setHighShelfParams(double frequency, double dbGain)
+void Biquad::setHighShelfParams(int index, double frequency, double dbGain)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -348,8 +420,9 @@
 
     if (frequency == 1) {
         // The z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     } else if (frequency > 0) {
         double w0 = piDouble * frequency;
         double S = 1; // filter slope (1 is max value)
@@ -366,15 +439,18 @@
         double a1 = 2 * (aMinusOne - aPlusOne * k);
         double a2 = aPlusOne - aMinusOne * k - k2;
 
-        setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+        setNormalizedCoefficients(index,
+            b0, b1, b2,
+            a0, a1, a2);
     } else {
         // When frequency = 0, the filter is just a gain, A^2.
-        setNormalizedCoefficients(A * A, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            A * A, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setPeakingParams(double frequency, double Q, double dbGain)
+void Biquad::setPeakingParams(int index, double frequency, double Q, double dbGain)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -397,22 +473,26 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha / A;
 
-            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+            setNormalizedCoefficients(index,
+                b0, b1, b2,
+                a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is A^2, so
             // set the filter that way.
-            setNormalizedCoefficients(A * A, 0, 0,
-                                      1, 0, 0);
+            setNormalizedCoefficients(index,
+                A * A, 0, 0,
+                1, 0, 0);
         }
     } else {
         // When frequency is 0 or 1, the z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setAllpassParams(double frequency, double Q)
+void Biquad::setAllpassParams(int index, double frequency, double Q)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -433,22 +513,26 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha;
 
-            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+            setNormalizedCoefficients(index,
+                b0, b1, b2,
+                a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is -1, so
             // set the filter that way.
-            setNormalizedCoefficients(-1, 0, 0,
-                                      1, 0, 0);
+            setNormalizedCoefficients(index,
+                -1, 0, 0,
+                1, 0, 0);
         }
     } else {
         // When frequency is 0 or 1, the z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setNotchParams(double frequency, double Q)
+void Biquad::setNotchParams(int index, double frequency, double Q)
 {
     // Clip frequencies to between 0 and 1, inclusive.
     frequency = std::max(0.0, std::min(frequency, 1.0));
@@ -469,22 +553,26 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha;
 
-            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+            setNormalizedCoefficients(index,
+                b0, b1, b2,
+                a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is 0, so
             // set the filter that way.
-            setNormalizedCoefficients(0, 0, 0,
-                                      1, 0, 0);
+            setNormalizedCoefficients(index,
+                0, 0, 0,
+                1, 0, 0);
         }
     } else {
         // When frequency is 0 or 1, the z-transform is 1.
-        setNormalizedCoefficients(1, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            1, 0, 0,
+            1, 0, 0);
     }
 }
 
-void Biquad::setBandpassParams(double frequency, double Q)
+void Biquad::setBandpassParams(int index, double frequency, double Q)
 {
     // No negative frequencies allowed.
     frequency = std::max(0.0, frequency);
@@ -505,13 +593,16 @@
             double a1 = -2 * k;
             double a2 = 1 - alpha;
 
-            setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+            setNormalizedCoefficients(index,
+                b0, b1, b2,
+                a0, a1, a2);
         } else {
             // When Q = 0, the above formulas have problems. If we look at
             // the z-transform, we can see that the limit as Q->0 is 1, so
             // set the filter that way.
-            setNormalizedCoefficients(1, 0, 0,
-                                      1, 0, 0);
+            setNormalizedCoefficients(index,
+                1, 0, 0,
+                1, 0, 0);
         }
     } else {
         // When the cutoff is zero, the z-transform approaches 0, if Q
@@ -519,8 +610,9 @@
         // pretty much undefined. What should we do in this case?
         // For now, just make the filter 0. When the cutoff is 1, the
         // z-transform also approaches 0.
-        setNormalizedCoefficients(0, 0, 0,
-                                  1, 0, 0);
+        setNormalizedCoefficients(index,
+            0, 0, 0,
+            1, 0, 0);
     }
 }
 
@@ -536,7 +628,9 @@
 
     double poleMag = abs(pole);
     double a2 = poleMag * poleMag;
-    setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
+    setNormalizedCoefficients(0,
+        b0, b1, b2,
+        1, a1, a2);
 }
 
 void Biquad::setAllpassPole(const std::complex<double>&pole)
@@ -567,11 +661,11 @@
     // with z1 = 1/z and z = exp(j*pi*frequency). Hence z1 = exp(-j*pi*frequency)
 
     // Make local copies of the coefficients as a micro-optimization.
-    double b0 = m_b0;
-    double b1 = m_b1;
-    double b2 = m_b2;
-    double a1 = m_a1;
-    double a2 = m_a2;
+    double b0 = m_b0[0];
+    double b1 = m_b1[0];
+    double b2 = m_b2[0];
+    double a1 = m_a1[0];
+    double a2 = m_a2[0];
 
     for (int k = 0; k < nFrequencies; ++k) {
         double omega = -piDouble * frequency[k];
diff --git a/third_party/WebKit/Source/platform/audio/Biquad.h b/third_party/WebKit/Source/platform/audio/Biquad.h
index 25f1895..a2d082f 100644
--- a/third_party/WebKit/Source/platform/audio/Biquad.h
+++ b/third_party/WebKit/Source/platform/audio/Biquad.h
@@ -52,16 +52,19 @@
 
     void process(const float* sourceP, float* destP, size_t framesToProcess);
 
+    bool hasSampleAccurateValues() const { return m_hasSampleAccurateValues; }
+    void setHasSampleAccurateValues(bool isSampleAccurate) { m_hasSampleAccurateValues = isSampleAccurate; }
+
     // frequency is 0 - 1 normalized, resonance and dbGain are in decibels.
     // Q is a unitless quality factor.
-    void setLowpassParams(double frequency, double resonance);
-    void setHighpassParams(double frequency, double resonance);
-    void setBandpassParams(double frequency, double Q);
-    void setLowShelfParams(double frequency, double dbGain);
-    void setHighShelfParams(double frequency, double dbGain);
-    void setPeakingParams(double frequency, double Q, double dbGain);
-    void setAllpassParams(double frequency, double Q);
-    void setNotchParams(double frequency, double Q);
+    void setLowpassParams(int, double frequency, double resonance);
+    void setHighpassParams(int, double frequency, double resonance);
+    void setBandpassParams(int, double frequency, double Q);
+    void setLowShelfParams(int, double frequency, double dbGain);
+    void setHighShelfParams(int, double frequency, double dbGain);
+    void setPeakingParams(int, double frequency, double Q, double dbGain);
+    void setAllpassParams(int, double frequency, double Q);
+    void setNotchParams(int, double frequency, double Q);
 
     // Set the biquad coefficients given a single zero (other zero will be conjugate)
     // and a single pole (other pole will be conjugate)
@@ -82,16 +85,20 @@
                               float* magResponse,
                               float* phaseResponse);
 private:
-    void setNormalizedCoefficients(double b0, double b1, double b2, double a0, double a1, double a2);
+    void setNormalizedCoefficients(int, double b0, double b1, double b2, double a0, double a1, double a2);
+
+    // If true, the filter coefficients are (possibly) time-varying due to a timeline automation on
+    // at least one filter parameter.
+    bool m_hasSampleAccurateValues;
 
     // Filter coefficients. The filter is defined as
     //
     // y[n] + m_a1*y[n-1] + m_a2*y[n-2] = m_b0*x[n] + m_b1*x[n-1] + m_b2*x[n-2].
-    double m_b0;
-    double m_b1;
-    double m_b2;
-    double m_a1;
-    double m_a2;
+    AudioDoubleArray m_b0;
+    AudioDoubleArray m_b1;
+    AudioDoubleArray m_b2;
+    AudioDoubleArray m_a1;
+    AudioDoubleArray m_a2;
 
 #if OS(MACOSX)
     void processFast(const float* sourceP, float* destP, size_t framesToProcess);
@@ -104,13 +111,12 @@
     IppsIIRState64f_32f* m_biquadState;
     Ipp8u* m_ippInternalBuffer;
 
-#else
+#endif
     // Filter memory
     double m_x1; // input delayed by 1 sample
     double m_x2; // input delayed by 2 samples
     double m_y1; // output delayed by 1 sample
     double m_y2; // output delayed by 2 samples
-#endif
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/ffmpeg/FFTFrameFFMPEG.cpp b/third_party/WebKit/Source/platform/audio/ffmpeg/FFTFrameFFMPEG.cpp
index d578f22..8085ec8 100644
--- a/third_party/WebKit/Source/platform/audio/ffmpeg/FFTFrameFFMPEG.cpp
+++ b/third_party/WebKit/Source/platform/audio/ffmpeg/FFTFrameFFMPEG.cpp
@@ -45,7 +45,8 @@
 namespace blink {
 
 #if ENABLE(ASSERT)
-const int kMaxFFTPow2Size = 24;
+// Max FFT size for FFMPEG.  WebAudio currently only uses FFTs up to size 15 (2^15 points).
+const int kMaxFFTPow2Size = 16;
 #endif
 
 // Normal constructor: allocates for a given fftSize.
diff --git a/third_party/WebKit/Source/platform/fonts/Font.cpp b/third_party/WebKit/Source/platform/fonts/Font.cpp
index 5b0df14..79f7842a 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.cpp
+++ b/third_party/WebKit/Source/platform/fonts/Font.cpp
@@ -322,7 +322,7 @@
     if (fontDescription().typesettingFeatures() && (runInfo.from || runInfo.to != run.length()))
         return ComplexPath;
 
-    if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings()->size() > 0 && m_fontDescription.letterSpacing() == 0)
+    if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings()->size() > 0)
         return ComplexPath;
 
     if (m_fontDescription.isVerticalBaseline())
diff --git a/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.cpp b/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.cpp
index 8a75ada..7c1cc34 100644
--- a/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.cpp
+++ b/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.cpp
@@ -113,6 +113,16 @@
     return isLeftToRightDirection(direction) ? m_bottom : m_top;
 }
 
+LayoutUnit LayoutRectOutsets::over(WritingMode writingMode) const
+{
+    return isHorizontalWritingMode(writingMode) ? m_top : m_right;
+}
+
+LayoutUnit LayoutRectOutsets::under(WritingMode writingMode) const
+{
+    return isHorizontalWritingMode(writingMode) ? m_bottom : m_left;
+}
+
 void LayoutRectOutsets::setBefore(WritingMode writingMode, LayoutUnit value)
 {
     switch (writingMode) {
diff --git a/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.h b/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.h
index 5f48140..a6aee2c7 100644
--- a/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.h
+++ b/third_party/WebKit/Source/platform/geometry/LayoutRectOutsets.h
@@ -93,6 +93,8 @@
     LayoutUnit after(WritingMode) const;
     LayoutUnit start(WritingMode, TextDirection) const;
     LayoutUnit end(WritingMode, TextDirection) const;
+    LayoutUnit over(WritingMode) const;
+    LayoutUnit under(WritingMode) const;
 
     void setBefore(WritingMode, LayoutUnit);
     void setAfter(WritingMode, LayoutUnit);
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
index 48725ea..48105ff 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
@@ -42,6 +42,7 @@
 #include "platform/graphics/paint/CachedDisplayItem.h"
 #include "platform/graphics/paint/DisplayItemClient.h"
 #include "platform/graphics/paint/PaintController.h"
+#include "platform/heap/Handle.h"
 #include "platform/transforms/TransformationMatrix.h"
 #include "public/platform/WebCompositorAnimationDelegate.h"
 #include "public/platform/WebContentLayer.h"
@@ -346,7 +347,7 @@
 
     // A layer that replicates this layer. We only allow one, for now.
     // The replica is not parented; this is the primary reference to it.
-    GraphicsLayer* m_replicaLayer; 
+    GraphicsLayer* m_replicaLayer;
     GraphicsLayer* m_replicatedLayer; // For a replica layer, a reference to the original layer.
     FloatPoint m_replicatedLayerPosition; // For a replica layer, the position of the replica.
 
@@ -367,6 +368,7 @@
 
     OwnPtr<ContentLayerDelegate> m_contentLayerDelegate;
 
+    GC_PLUGIN_IGNORE("509911")
     ScrollableArea* m_scrollableArea;
     GraphicsLayerDebugInfo m_debugInfo;
     int m_3dRenderingContext;
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
index 10c3937..9f07924 100644
--- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -335,11 +335,6 @@
 
     ~JPEGImageReader()
     {
-        close();
-    }
-
-    void close()
-    {
 #if USE(QCMSLIB)
         clearColorTransform();
 #endif
@@ -595,11 +590,11 @@
                     if (!m_decoder->outputScanlines()) {
                         if (m_decoder->failed())
                             return false;
+                        // If no scan lines were read, flag it so we don't call
+                        // jpeg_start_output() multiple times for the same scan.
                         if (!m_info.output_scanline)
-                            // Didn't manage to read any lines - flag so we
-                            // don't call jpeg_start_output() multiple times for
-                            // the same scan.
                             m_info.output_scanline = 0xffffff;
+
                         return false; // I/O suspension.
                     }
 
@@ -809,9 +804,9 @@
 unsigned JPEGImageDecoder::desiredScaleNumerator() const
 {
     size_t originalBytes = size().width() * size().height() * 4;
-    if (originalBytes <= m_maxDecodedBytes) {
+
+    if (originalBytes <= m_maxDecodedBytes)
         return scaleDenominator;
-    }
 
     // Downsample according to the maximum decoded size.
     unsigned scaleNumerator = static_cast<unsigned>(floor(sqrt(
@@ -832,6 +827,7 @@
 {
     if (!hasImagePlanes())
         return false;
+
     PlatformInstrumentation::willDecodeImage("JPEG");
     decode(false);
     PlatformInstrumentation::didDecodeImage();
@@ -901,6 +897,7 @@
 {
     JSAMPARRAY samples = reader->samples();
     jpeg_decompress_struct* info = reader->info();
+
     JSAMPARRAY bufferraw[3];
     JSAMPROW bufferraw2[32];
     bufferraw[0] = &bufferraw2[0]; // Y channel rows (8 or 16)
@@ -940,6 +937,7 @@
                 bufferraw2[i] = dummyRow;
             }
         }
+
         int scaledScanline = info->output_scanline / v;
         // Assign 8 rows of memory to read the U and V channels.
         for (int i = 0; i < 8; ++i) {
@@ -956,14 +954,14 @@
                 bufferraw2[24 + i] = dummyRow;
             }
         }
-        JDIMENSION scanlinesRead = jpeg_read_raw_data(info, bufferraw, yScanlinesToRead);
 
-        if (scanlinesRead == 0)
+        JDIMENSION scanlinesRead = jpeg_read_raw_data(info, bufferraw, yScanlinesToRead);
+        if (!scanlinesRead)
             return false;
 
-        if (hasYLastRow) {
+        if (hasYLastRow)
             memcpy(&outputY[yMaxH * rowBytesY], yLastRow, yWidth);
-        }
+
         if (hasUVLastRow) {
             memcpy(&outputU[uvMaxH * rowBytesU], uLastRow, uvSize.width());
             memcpy(&outputV[uvMaxH * rowBytesV], vLastRow, uvSize.width());
@@ -971,15 +969,13 @@
     }
 
     info->output_scanline = std::min(info->output_scanline, info->output_height);
-
     return true;
 }
 
 bool JPEGImageDecoder::outputScanlines()
 {
-    if (hasImagePlanes()) {
+    if (hasImagePlanes())
         return outputRawData(m_reader.get(), m_imagePlanes.get());
-    }
 
     if (m_frameBufferCache.isEmpty())
         return false;
@@ -994,9 +990,10 @@
 
         if (!buffer.setSize(info->output_width, info->output_height))
             return setFailed();
-        buffer.setStatus(ImageFrame::FramePartial);
+
         // The buffer is transparent outside the decoded area while the image is
         // loading. The image will be marked fully opaque in complete().
+        buffer.setStatus(ImageFrame::FramePartial);
         buffer.setHasAlpha(true);
 
         // For JPEGs, the frame always fills the entire image.
@@ -1036,9 +1033,8 @@
     if (m_frameBufferCache.isEmpty())
         return;
 
-    ImageFrame& buffer = m_frameBufferCache[0];
-    buffer.setHasAlpha(false);
-    buffer.setStatus(ImageFrame::FrameComplete);
+    m_frameBufferCache[0].setHasAlpha(false);
+    m_frameBufferCache[0].setStatus(ImageFrame::FrameComplete);
 }
 
 inline bool isComplete(const JPEGImageDecoder* decoder, bool onlySize)
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
index b2f0baf..88d8c69c 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -105,17 +105,14 @@
 
     ~PNGImageReader()
     {
-        close();
-    }
-
-    void close()
-    {
-        if (m_png && m_info)
-            // This will zero the pointers.
-            png_destroy_read_struct(&m_png, &m_info, 0);
 #if USE(QCMSLIB)
         clearColorTransform();
 #endif
+        if (m_png && m_info) {
+            // This will zero the pointers.
+            png_destroy_read_struct(&m_png, &m_info, 0);
+        }
+
         m_readOffset = 0;
     }
 
diff --git a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h
index cb161da3..ef6286a 100644
--- a/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h
+++ b/third_party/WebKit/Source/platform/scroll/ProgrammaticScrollAnimator.h
@@ -6,6 +6,7 @@
 #define ProgrammaticScrollAnimator_h
 
 #include "platform/geometry/FloatPoint.h"
+#include "platform/heap/Handle.h"
 #include "public/platform/WebCompositorAnimationDelegate.h"
 #include "public/platform/WebCompositorAnimationPlayerClient.h"
 #include "wtf/Allocator.h"
@@ -75,6 +76,7 @@
     OwnPtr<WebCompositorAnimationPlayer> m_compositorPlayer;
     int m_compositorAnimationAttachedToLayerId;
 
+    GC_PLUGIN_IGNORE("509911")
     ScrollableArea* m_scrollableArea;
     OwnPtr<WebScrollOffsetAnimationCurve> m_animationCurve;
     FloatPoint m_targetOffset;
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorBase.h b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorBase.h
index e1ab6121..0917eea 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorBase.h
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorBase.h
@@ -34,6 +34,7 @@
 #include "platform/PlatformExport.h"
 #include "platform/PlatformWheelEvent.h"
 #include "platform/geometry/FloatSize.h"
+#include "platform/heap/Handle.h"
 #include "platform/scroll/ScrollTypes.h"
 #include "wtf/Forward.h"
 
@@ -103,6 +104,7 @@
 
     virtual void notifyPositionChanged();
 
+    GC_PLUGIN_IGNORE("509911")
     ScrollableArea* m_scrollableArea;
     float m_currentPosX; // We avoid using a FloatPoint in order to reduce
     float m_currentPosY; // subclass code complexity.
diff --git a/third_party/WebKit/Source/web/LinkHighlightImplTest.cpp b/third_party/WebKit/Source/web/LinkHighlightImplTest.cpp
index b9754fb4..185af6a 100644
--- a/third_party/WebKit/Source/web/LinkHighlightImplTest.cpp
+++ b/third_party/WebKit/Source/web/LinkHighlightImplTest.cpp
@@ -168,8 +168,6 @@
 // A lifetime test: delete LayerTreeView while running LinkHighlights.
 TEST(LinkHighlightImplTest, resetLayerTreeView)
 {
-    FrameTestHelpers::UseMockScrollbarSettings mockScrollbarSettings;
-
     OwnPtr<FakeCompositingWebViewClient> webViewClient = adoptPtr(new FakeCompositingWebViewClient());
 
     const std::string baseURL("http://www.test.com/");
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
index ea9b0570..3a311b1 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
@@ -169,7 +169,7 @@
     collection->dispatchConnectEvent(callbacks.release(), targetURL, origin, portID);
 }
 
-void ServiceWorkerGlobalScopeProxy::dispatchSyncEvent(int eventID, const WebSyncRegistration& registration)
+void ServiceWorkerGlobalScopeProxy::dispatchSyncEvent(int eventID, const WebSyncRegistration& registration, LastChanceOption lastChance)
 {
     ASSERT(m_workerGlobalScope);
     if (!RuntimeEnabledFeatures::backgroundSyncEnabled()) {
@@ -177,7 +177,7 @@
         return;
     }
     WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Sync, eventID);
-    RefPtrWillBeRawPtr<Event> event(SyncEvent::create(EventTypeNames::sync, SyncRegistration::create(registration, m_workerGlobalScope->registration()), observer));
+    RefPtrWillBeRawPtr<Event> event(SyncEvent::create(EventTypeNames::sync, SyncRegistration::create(registration, m_workerGlobalScope->registration()), lastChance == IsLastChance, observer));
     m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer);
 }
 
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
index a20c5ae..7c90213cee 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
@@ -81,7 +81,7 @@
     void dispatchNotificationClickEvent(int, int64_t notificationID, const WebNotificationData&, int actionIndex) override;
     void dispatchPushEvent(int, const WebString& data) override;
     void dispatchServicePortConnectEvent(WebServicePortConnectEventCallbacks*, const WebURL& targetURL, const WebString& origin, WebServicePortID) override;
-    void dispatchSyncEvent(int, const WebSyncRegistration&) override;
+    void dispatchSyncEvent(int, const WebSyncRegistration&, LastChanceOption) override;
 
     // WorkerReportingProxy overrides:
     void reportException(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL, int exceptionId) override;
diff --git a/third_party/WebKit/Source/web/WebDataSourceImpl.h b/third_party/WebKit/Source/web/WebDataSourceImpl.h
index 89a97eb..1c960aad 100644
--- a/third_party/WebKit/Source/web/WebDataSourceImpl.h
+++ b/third_party/WebKit/Source/web/WebDataSourceImpl.h
@@ -81,6 +81,7 @@
     WebDataSourceImpl(LocalFrame*, const ResourceRequest&, const SubstituteData&);
     ~WebDataSourceImpl() override;
     void detachFromFrame() override;
+    String debugName() const override { return "WebDataSourceImpl"; }
 
     // Mutable because the const getters will magically sync these to the
     // latest version from WebKit.
diff --git a/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionClient.h b/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionClient.h
index 2ec7911..749a0bd 100644
--- a/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionClient.h
+++ b/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionClient.h
@@ -11,7 +11,8 @@
 
 enum class WebPresentationConnectionState {
     Connected = 0,
-    Disconnected,
+    Closed,
+    Terminated,
 };
 
 // The implementation the embedder has to provide for the Presentation API to work.
diff --git a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
index 314d7ca7..df94ff5 100644
--- a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
+++ b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
@@ -72,9 +72,14 @@
     // Passes ownership of the callbacks.
     virtual void dispatchServicePortConnectEvent(WebServicePortConnectEventCallbacks*, const WebURL& targetURL, const WebString& origin, WebServicePortID) = 0;
 
+    enum LastChanceOption {
+        IsNotLastChance,
+        IsLastChance
+    };
+
     // Once the ServiceWorker has finished handling the sync event,
     // didHandleSyncEvent is called on the context client.
-    virtual void dispatchSyncEvent(int syncEventID, const WebSyncRegistration&) = 0;
+    virtual void dispatchSyncEvent(int syncEventID, const WebSyncRegistration&, LastChanceOption) = 0;
 };
 
 } // namespace blink
diff --git a/third_party/closure_compiler/externs/bluetooth.js b/third_party/closure_compiler/externs/bluetooth.js
index 57287aeb3..43162bf 100644
--- a/third_party/closure_compiler/externs/bluetooth.js
+++ b/third_party/closure_compiler/externs/bluetooth.js
@@ -69,6 +69,8 @@
  *   type: (!chrome.bluetooth.DeviceType|undefined),
  *   paired: (boolean|undefined),
  *   connected: (boolean|undefined),
+ *   connecting: (boolean|undefined),
+ *   connectable: (boolean|undefined),
  *   uuids: (!Array<string>|undefined),
  *   inquiryRssi: (number|undefined),
  *   inquiryTxPower: (number|undefined)
diff --git a/third_party/closure_compiler/externs/settings_private.js b/third_party/closure_compiler/externs/settings_private.js
index 66c39de..5988b39 100644
--- a/third_party/closure_compiler/externs/settings_private.js
+++ b/third_party/closure_compiler/externs/settings_private.js
@@ -92,6 +92,21 @@
 chrome.settingsPrivate.getPref = function(name, callback) {};
 
 /**
+ * Gets the page zoom factor as an integer percentage.
+ * @param {function(number):void} callback
+ * @see https://developer.chrome.com/extensions/settingsPrivate#method-getDefaultZoomPercent
+ */
+chrome.settingsPrivate.getDefaultZoomPercent = function(callback) {};
+
+/**
+ * Sets the page zoom factor from a zoom percentage.
+ * @param {number} percent
+ * @param {function(boolean):void=} callback
+ * @see https://developer.chrome.com/extensions/settingsPrivate#method-setDefaultZoomPercent
+ */
+chrome.settingsPrivate.setDefaultZoomPercent = function(percent, callback) {};
+
+/**
  * <p>Fired when a set of prefs has changed.</p><p>|prefs| The prefs that
  * changed.</p>
  * @type {!ChromeEvent}
diff --git a/third_party/mesa/BUILD.gn b/third_party/mesa/BUILD.gn
index 6377045..ad27ff7 100644
--- a/third_party/mesa/BUILD.gn
+++ b/third_party/mesa/BUILD.gn
@@ -6,7 +6,7 @@
 
 config("mesa_headers_config") {
   include_dirs = [ "src/include" ]
-  if (use_x11) {
+  if (!use_x11) {
     defines = [ "MESA_EGL_NO_X11_HEADERS" ]
   }
 }
diff --git a/third_party/qcms/README.chromium b/third_party/qcms/README.chromium
index 0215e61f..1d869b10 100644
--- a/third_party/qcms/README.chromium
+++ b/third_party/qcms/README.chromium
@@ -115,6 +115,8 @@
    - https://code.google.com/p/chromium/issues/detail?id=532258
  - Add support for VCGT tag formula gamma
    - https://code.google.com/p/chromium/issues/detail?id=551568
+ - Minimize transform RMS in qcms_transform_data_rgb(a)_out_lut
+   - https://code.google.com/p/chromium/issues/detail?id=532910
 
 For the Chromium changes, since the import, in a patch format run:
   git diff b8456f38 src
diff --git a/third_party/qcms/src/transform-sse2.c b/third_party/qcms/src/transform-sse2.c
index 34d0d86..c06db69 100644
--- a/third_party/qcms/src/transform-sse2.c
+++ b/third_party/qcms/src/transform-sse2.c
@@ -25,8 +25,9 @@
 #include "qcmsint.h"
 
 /* pre-shuffled: just load these into XMM reg instead of load-scalar/shufps sequence */
-#define FLOATSCALE  (float)(PRECACHE_OUTPUT_SIZE)
-#define CLAMPMAXVAL ( ((float) (PRECACHE_OUTPUT_SIZE - 1)) / PRECACHE_OUTPUT_SIZE )
+#define FLOATSCALE  (float)(PRECACHE_OUTPUT_SIZE - 1)
+#define CLAMPMAXVAL 1.0f
+
 static const ALIGN float floatScaleX4[4] =
     { FLOATSCALE, FLOATSCALE, FLOATSCALE, FLOATSCALE};
 static const ALIGN float clampMaxValueX4[4] =
@@ -103,7 +104,7 @@
         vec_b = _mm_mul_ps(vec_b, mat2);
 
         /* crunch, crunch, crunch */
-        vec_r  = _mm_add_ps(vec_r, _mm_add_ps(vec_g, vec_b));
+        vec_r  = _mm_add_ps(vec_g, _mm_add_ps(vec_r, vec_b));
         vec_r  = _mm_max_ps(min, vec_r);
         vec_r  = _mm_min_ps(max, vec_r);
         result = _mm_mul_ps(vec_r, scale);
@@ -134,7 +135,7 @@
     vec_g = _mm_mul_ps(vec_g, mat1);
     vec_b = _mm_mul_ps(vec_b, mat2);
 
-    vec_r  = _mm_add_ps(vec_r, _mm_add_ps(vec_g, vec_b));
+    vec_r  = _mm_add_ps(vec_g, _mm_add_ps(vec_r, vec_b));
     vec_r  = _mm_max_ps(min, vec_r);
     vec_r  = _mm_min_ps(max, vec_r);
     result = _mm_mul_ps(vec_r, scale);
@@ -223,7 +224,7 @@
         alpha   = src[3];
 
         /* crunch, crunch, crunch */
-        vec_r  = _mm_add_ps(vec_r, _mm_add_ps(vec_g, vec_b));
+        vec_r  = _mm_add_ps(vec_g, _mm_add_ps(vec_r, vec_b));
         vec_r  = _mm_max_ps(min, vec_r);
         vec_r  = _mm_min_ps(max, vec_r);
         result = _mm_mul_ps(vec_r, scale);
@@ -256,7 +257,7 @@
 
     dest[3] = alpha;
 
-    vec_r  = _mm_add_ps(vec_r, _mm_add_ps(vec_g, vec_b));
+    vec_r  = _mm_add_ps(vec_g, _mm_add_ps(vec_r, vec_b));
     vec_r  = _mm_max_ps(min, vec_r);
     vec_r  = _mm_min_ps(max, vec_r);
     result = _mm_mul_ps(vec_r, scale);
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index e9632c6..134179d 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -60,8 +60,8 @@
     # This is just for completeness; any bot that uses this config should never actually run MB.
     'none': ['none'],
 
+    'noswarming_gn_release_bot_linux_dump_symbols': ['noswarming', 'gn', 'release_bot', 'linux_dump_symbols'],
     'noswarming_gyp_release_bot': ['noswarming', 'gyp', 'release_bot'],
-    'noswarming_gyp_release_bot_linux_dump_symbols': ['noswarming', 'gyp', 'release_bot', 'linux_dump_symbols'],
     'noswarming_gyp_release_bot_mac_strip': ['noswarming', 'gyp', 'release_bot', 'mac_strip'],
     'noswarming_gyp_release_bot_x86_linux_dump_symbols': ['noswarming', 'gyp', 'release_bot', 'x86', 'linux_dump_symbols'],
 
@@ -244,7 +244,7 @@
     'libfuzzer': { 'gn_args': 'use_libfuzzer=true' },
 
     'linux_dump_symbols': {
-      'gn_args': 'error', # TODO(GYP): Port linux_dump_symbols?
+      'gn_args': '', # TODO(GYP): Port linux_dump_symbols?
       'gyp_defines': 'linux_dump_symbols=1',
     },
 
@@ -353,7 +353,7 @@
     'chromium': {
       'Win': 'noswarming_gyp_release_bot',
       'Mac': 'noswarming_gyp_release_bot_mac_strip',
-      'Linux x64': 'noswarming_gyp_release_bot_linux_dump_symbols',
+      'Linux x64': 'noswarming_gn_release_bot_linux_dump_symbols',
       'Linux': 'noswarming_gyp_release_bot_x86_linux_dump_symbols',
       'Android': 'android_gyp_release_bot_minimal_symbols',
     },
@@ -461,6 +461,9 @@
       'android_chromium_gn_compile_rel': 'android_gn_release_bot',
       'linux_chromium_gn_rel': 'gn_release_bot',
     },
+    'tryserver.chromium.android': {
+      'android_chromium_gn_rel': 'android_gn_release_trybot',
+    },
     'tryserver.chromium.angle': {
       'linux_angle_rel_ng': 'swarming_gpu_tests_gyp_release_trybot',
       'linux_angle_dbg_ng': 'swarming_gpu_tests_gyp_debug_trybot',
@@ -489,6 +492,7 @@
       'linux_arm_tester': 'none',
       'linux_chromium_compile_dbg_32_ng': 'swarming_gyp_debug_trybot_x86',
       'linux_chromium_dbg_32_ng': 'swarming_gyp_debug_trybot_x86',
+      'linux_chromium_archive_rel_ng': 'noswarming_gn_release_bot_linux_dump_symbols',
       'linux_chromium_clobber_rel_ng': 'gyp_release_trybot',
       'linux_chromium_gn_upload': 'gn_linux_upload',
       'cast_shell_linux': 'cast_gyp_release_trybot',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 20361438..979dd73 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -725,6 +725,22 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Accel_Toggle_Touchpad">
+  <owner>afakhry@chromium.org</owner>
+  <description>
+    Metric recorded when the user toggles the touchpad status using the
+    debugging accelerator.
+  </description>
+</action>
+
+<action name="Accel_Toggle_Touchscreen">
+  <owner>afakhry@chromium.org</owner>
+  <description>
+    Metric recorded when the user toggles the touchscreen status using the
+    debugging accelerator.
+  </description>
+</action>
+
 <action name="Accel_Touch_Hud_Clear">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
@@ -9365,6 +9381,14 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Options_DefaultFullScreenSettingChanged">
+  <owner>lshang@chromium.org</owner>
+  <description>
+    Recorded when the default value for the Full Screen content setting is
+    changed by the user.
+  </description>
+</action>
+
 <action name="Options_DefaultGeolocationSettingChanged">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
@@ -9439,6 +9463,14 @@
   </description>
 </action>
 
+<action name="Options_DefaultPPAPIBrokerSettingChanged">
+  <owner>lshang@chromium.org</owner>
+  <description>
+    Recorded when the default value for the PPAPI Broker content setting is
+    changed by the user.
+  </description>
+</action>
+
 <action name="Options_DefaultPluginsSettingChanged">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
@@ -9449,6 +9481,14 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Options_DefaultProtectedMediaIdentifierSettingChanged">
+  <owner>lshang@chromium.org</owner>
+  <description>
+    Recorded when the default value for the Protected Media Identifier content
+    setting is changed by the user.
+  </description>
+</action>
+
 <action name="Options_DefaultPushMessagingSettingChanged">
   <owner>miguelg@chromium.org</owner>
   <description>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 359e403..d4a8734 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -649,6 +649,16 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.Accelerators.Deprecated.NextIME"
+    enum="DeprecatedAcceleratorUsage">
+  <owner>afakhry@chromium.org</owner>
+  <summary>
+    The switch to the next IME action has two accelerators:   - Shift+Alt which
+    is deprecated.   - Ctrl+Shift+Space which is new. This histogram shows the
+    number of times each accelerator (deprecated and new) is used.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Accelerators.Deprecated.ShowTaskManager"
     enum="DeprecatedAcceleratorUsage">
   <owner>afakhry@chromium.org</owner>
@@ -2712,6 +2722,33 @@
   </summary>
 </histogram>
 
+<histogram name="BackgroundSync.LaunchTask.CancelSuccess" enum="BooleanSuccess">
+  <owner>iclelland@chromium.org</owner>
+  <summary>
+    Records the result of attempting to cancel a future browser launch using the
+    GCM Network Manager on Android.
+  </summary>
+</histogram>
+
+<histogram name="BackgroundSync.LaunchTask.PlayServicesAvailable"
+    enum="Boolean">
+  <owner>iclelland@chromium.org</owner>
+  <summary>
+    Records whether Google Play Services is available to the Background Sync
+    system on Android, for scheduling future sync events when the browser is not
+    running. This will be logged at most once per run.
+  </summary>
+</histogram>
+
+<histogram name="BackgroundSync.LaunchTask.ScheduleSuccess"
+    enum="BooleanSuccess">
+  <owner>iclelland@chromium.org</owner>
+  <summary>
+    Records the result of attempting to schedule a future browser launch using
+    the GCM Network Manager on Android.
+  </summary>
+</histogram>
+
 <histogram name="BackgroundSync.Registration.OneShot"
     enum="BackgroundSyncStatus">
   <owner>iclelland@chromium.org</owner>
@@ -11354,6 +11391,15 @@
   <summary>The result of an open attempt to an Extensions database.</summary>
 </histogram>
 
+<histogram name="Extensions.Database.Restore"
+    enum="LevelDBCorruptionRestoreValue">
+  <owner>cmumford@chromium.org</owner>
+  <summary>
+    The result of an attempt to recover from an attempt to open a database that
+    failed as a result of corruption.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.DeclarativeRulesStorageInitialization"
     units="milliseconds">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -22770,6 +22816,32 @@
   </summary>
 </histogram>
 
+<histogram name="Net.ErrorCodesForHTTPSGoogleMainFrame" enum="NetErrorCodes">
+  <obsolete>
+    Deprecated as of 2012/5/16, replaced by
+    Net.ErrorCodesForHTTPSGoogleMainFrame2, which measures the same data but
+    includes ERR_ABORT and OK.
+  </obsolete>
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
+  <summary>
+    Errors resulting from loading pages from https://www.google.com. Note that
+    this only counts the errors in &quot;main frames&quot;, so it is a measure
+    of the error pages that users actually see (it does not for example count
+    the error codes for subresoures on a page). This is a temporary histogram,
+    added in order to debug query loss from the SSL Search launch.
+  </summary>
+</histogram>
+
+<histogram name="Net.ErrorCodesForHTTPSGoogleMainFrame2" enum="NetErrorCodes">
+  <owner>mmenke@chromium.org</owner>
+  <summary>
+    Positive net error codes that requests for pages end with, including net::OK
+    and net::ERR_ABORTED.  This only counts loads in &quot;main frames&quot; for
+    https://www.google.com. Subresources or main frame navigations to other
+    origins are not included.
+  </summary>
+</histogram>
+
 <histogram name="Net.ErrorCodesForImages" enum="NetErrorCodes">
   <owner>skonig@chromium.org</owner>
   <owner>hbengali@chromium.org</owner>
@@ -37909,6 +37981,15 @@
   </summary>
 </histogram>
 
+<histogram name="RenderViewContextMenu.OpenLinkAsUser" enum="OpenLinkAsUser">
+  <owner>jochen@chromium.org</owner>
+  <summary>
+    State of the profile that is activated via the &quot;Open Link as User&quot;
+    menu. Logged when one of the &quot;Open Link as User&quot; context menu
+    options is selected.
+  </summary>
+</histogram>
+
 <histogram name="RenderViewContextMenu.Shown" enum="RenderViewContextMenuItem">
   <owner>vitalybuka@chromium.org</owner>
   <summary>Count of renderer view context menu items shown.</summary>
@@ -50084,6 +50165,15 @@
   </summary>
 </histogram>
 
+<histogram name="Variations.FirstRunResult" enum="VariationsFirstRunResult">
+  <owner>asvitkine@chromium.org</owner>
+  <summary>
+    The result of attempting to import an initial variations seed during Android
+    Chrome first run. Logged from VariationsSeedStore::LoadSeed when seed prefs
+    do not exist.
+  </summary>
+</histogram>
+
 <histogram name="Variations.HeaderConstructionTime" units="microseconds">
   <owner>asvitkine@chromium.org</owner>
   <summary>How long it took to create the X-Client-Data header.</summary>
@@ -59853,6 +59943,8 @@
   <int value="1091" label="TABCAPTURE_CAPTUREOFFSCREENTAB"/>
   <int value="1092" label="LANGUAGESETTINGSPRIVATE_ADDSPELLCHECKWORD"/>
   <int value="1093" label="LANGUAGESETTINGSPRIVATE_REMOVESPELLCHECKWORD"/>
+  <int value="1094" label="SETTINGSPRIVATE_GETDEFAULTZOOMPERCENTFUNCTION"/>
+  <int value="1095" label="SETTINGSPRIVATE_SETDEFAULTZOOMPERCENTFUNCTION"/>
 </enum>
 
 <enum name="ExtensionInstallCause" type="int">
@@ -64964,6 +65056,12 @@
   <int value="4" label="Bookmark shortcut widget"/>
 </enum>
 
+<enum name="LevelDBCorruptionRestoreValue" type="int">
+  <int value="0" label="Delete Success"/>
+  <int value="1" label="Delete Failure"/>
+  <int value="2" label="Repair Success"/>
+</enum>
+
 <enum name="LevelDBCorruptionTypes" type="int">
   <int value="0" label="other"/>
   <int value="1" label="missing files"/>
@@ -68189,7 +68287,11 @@
   <int value="408" label="SEARCH_HISTORY via SearchProvider"/>
   <int value="409" label="SEARCH_SUGGEST via SearchProvider"/>
   <int value="410" label="SEARCH_OTHER_ENGINE via SearchProvider"/>
+  <int value="414" label="SEARCH_SUGGEST_ENTITY via SearchProvider"/>
+  <int value="415" label="SEARCH_SUGGEST_INFINITE via SearchProvider"/>
   <int value="416" label="SEARCH_SUGGEST_PERSONALIZED via SearchProvider"/>
+  <int value="422" label="SEARCH_SUGGEST_ANSWER via SearchProvider"/>
+  <int value="423" label="CALCULATOR via SearchProvider"/>
   <int value="505" label="HISTORY_KEYWORD via KeywordProvider"/>
   <int value="510" label="SEARCH_OTHER_ENGINE via KeywordProvider"/>
   <int value="606" label="NAVSUGGEST via BuiltinProvider"/>
@@ -68385,6 +68487,12 @@
   <int value="3" label="Failed to create directory."/>
 </enum>
 
+<enum name="OpenLinkAsUser" type="int">
+  <int value="0" label="Active profile."/>
+  <int value="1" label="Inactive, multi-profile."/>
+  <int value="2" label="Inactive, single-profile."/>
+</enum>
+
 <enum name="OSAgnosticErrno" type="int">
   <summary>Errno values with the same meanings on Mac/Win/Linux.</summary>
   <int value="0" label="0">No error</int>
@@ -75404,6 +75512,13 @@
   <int value="4" label="Valid Signature for Seed"/>
 </enum>
 
+<enum name="VariationsFirstRunResult" type="int">
+  <int value="0" label="Seed imported successfully"/>
+  <int value="1" label="Seed import failed - no callback"/>
+  <int value="2" label="Seed import failed - no first run seed"/>
+  <int value="3" label="Seed import failed - failed to store seed"/>
+</enum>
+
 <enum name="VariationsPermanentConsistencyCountryResult" type="int">
   <int value="0" label="Saved pref missing and no country code in seed"/>
   <int value="1" label="Saved pref missing and country code in seed"/>
@@ -77492,6 +77607,13 @@
   <affected-histogram name="Extensions.Database.Open"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="ExtensionsDatabaseRestore" separator=".">
+  <suffix name="Rules" label="Rules backing stores"/>
+  <suffix name="Settings" label="Settings backing stores"/>
+  <suffix name="State" label="State backing stores"/>
+  <affected-histogram name="Extensions.Database.Restore"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="ExternalExtensionEvent" separator="">
   <suffix name="NonWebstore"
       label="sideloaded extensions that don't update from the webstore"/>
diff --git a/tools/perf/benchmarks/dummy_benchmark.py b/tools/perf/benchmarks/dummy_benchmark.py
new file mode 100644
index 0000000..2011be2f
--- /dev/null
+++ b/tools/perf/benchmarks/dummy_benchmark.py
@@ -0,0 +1,58 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+Benchmarks in this file is created for the purpose of testing telemetry
+integration with perf dashboard and bisect bot. The number they produce aren't
+meant to represent any actual performance data of the browser.
+"""
+
+import random
+
+from core import perf_benchmark
+
+from telemetry.value import scalar
+from telemetry.page import page_test
+
+import page_sets
+
+
+class _DummyTest(page_test.PageTest):
+  def __init__(self, avg, std):
+    super(_DummyTest, self).__init__()
+    self._avg = avg
+    self._std = std
+
+  def ValidateAndMeasurePage(self, page, tab, results):
+    results.AddValue(scalar.ScalarValue(
+        page=page,
+        name='gaussian-value', units='ms',
+        value=random.gauss(self._avg, self._std),
+        description=('Random number that follows the Gaussian distribution '
+                     'with mean=%s and std=%s' % (self._avg, self._std))))
+
+
+class _DummyBenchmark(perf_benchmark.PerfBenchmark):
+  page_set = page_sets.DummyStorySet
+
+
+class DummyBenchmarkOne(_DummyBenchmark):
+  """ A low noise benchmark with mean=100 & std=1. """
+
+  def CreatePageTest(self, options):
+    return _DummyTest(100, 1)
+
+  @classmethod
+  def Name(cls):
+    return 'dummy_benchmark.stable_benchmark_1'
+
+
+class DummyBenchmarkTwo(_DummyBenchmark):
+  """ A noisy benchmark with mean=50 & std=20. """
+
+  def CreatePageTest(self, options):
+    return _DummyTest(50, 20)
+
+  @classmethod
+  def Name(cls):
+    return 'dummy_benchmark.noisy_benchmark_1'
diff --git a/tools/perf/chrome_telemetry_build/__init__.py b/tools/perf/chrome_telemetry_build/__init__.py
index 040d52a6..a298896b 100644
--- a/tools/perf/chrome_telemetry_build/__init__.py
+++ b/tools/perf/chrome_telemetry_build/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/chrome_telemetry_build/chromium_config.py b/tools/perf/chrome_telemetry_build/chromium_config.py
index a0297ac..3a37421 100644
--- a/tools/perf/chrome_telemetry_build/chromium_config.py
+++ b/tools/perf/chrome_telemetry_build/chromium_config.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/chrome_telemetry_build/telemetry_binary_manager.isolate b/tools/perf/chrome_telemetry_build/telemetry_binary_manager.isolate
index 424d589a..da18846 100644
--- a/tools/perf/chrome_telemetry_build/telemetry_binary_manager.isolate
+++ b/tools/perf/chrome_telemetry_build/telemetry_binary_manager.isolate
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 {
diff --git a/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate b/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate
index 4495a4d4..f87dcd48 100644
--- a/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate
+++ b/tools/perf/chrome_telemetry_build/telemetry_chrome_test.isolate
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 {
diff --git a/tools/perf/core/path_util.py b/tools/perf/core/path_util.py
index ee84e5c..b3aee1e 100644
--- a/tools/perf/core/path_util.py
+++ b/tools/perf/core/path_util.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/ct_benchmarks_util.py b/tools/perf/ct_benchmarks_util.py
index d82a8bfa..8ca4bbd2 100755
--- a/tools/perf/ct_benchmarks_util.py
+++ b/tools/perf/ct_benchmarks_util.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/fetch_benchmark_deps.py b/tools/perf/fetch_benchmark_deps.py
index 8a968a6..d79a7117 100755
--- a/tools/perf/fetch_benchmark_deps.py
+++ b/tools/perf/fetch_benchmark_deps.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/list_affected_benchmarks b/tools/perf/list_affected_benchmarks
index 63dbc80..99a0428 100755
--- a/tools/perf/list_affected_benchmarks
+++ b/tools/perf/list_affected_benchmarks
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Copyright 2013 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/measurements/page_cycler.js b/tools/perf/measurements/page_cycler.js
index 46708c6..9fdcc581 100644
--- a/tools/perf/measurements/page_cycler.js
+++ b/tools/perf/measurements/page_cycler.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Copyright 2013 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/dummy_page.html b/tools/perf/page_sets/dummy_page.html
new file mode 100644
index 0000000..aef37954
--- /dev/null
+++ b/tools/perf/page_sets/dummy_page.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<!--
+Copyright 2015 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+<html>
+<head>
+  <style>
+    html, body {
+      margin: 0;
+      padding: 0;
+    }
+  </style>
+</head>
+<body>
+  This dummy page is used for testing purpose only. ¯\_(ツ)_/¯
+</body>
+<script>
+  window.__dummy_value = 1;
+</script>
+</html>
diff --git a/tools/perf/page_sets/dummy_story_set.py b/tools/perf/page_sets/dummy_story_set.py
new file mode 100644
index 0000000..5575468
--- /dev/null
+++ b/tools/perf/page_sets/dummy_story_set.py
@@ -0,0 +1,23 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+from telemetry.page import page as page_module
+from telemetry import story
+
+
+class DummyPage(page_module.Page):
+
+  def __init__(self, page_set):
+    super(DummyPage, self).__init__(
+      url='file://dummy_page.html',
+      page_set=page_set)
+
+  def PerformPageInteractions(self, action_runner):
+    assert action_runner.EvaluateJavaScript('1 + window.__dummy_value') == 2
+
+
+class DummyStorySet(story.StorySet):
+
+  def __init__(self):
+    super(DummyStorySet, self).__init__()
+    self.AddStory(DummyPage(self))
diff --git a/tools/perf/page_sets/indexeddb_perf/endure/app-worker.js b/tools/perf/page_sets/indexeddb_perf/endure/app-worker.js
index e96c38b..d98ee3e 100644
--- a/tools/perf/page_sets/indexeddb_perf/endure/app-worker.js
+++ b/tools/perf/page_sets/indexeddb_perf/endure/app-worker.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/indexeddb_perf/endure/app.js b/tools/perf/page_sets/indexeddb_perf/endure/app.js
index ad611b5..6e0d5bc 100644
--- a/tools/perf/page_sets/indexeddb_perf/endure/app.js
+++ b/tools/perf/page_sets/indexeddb_perf/endure/app.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/indexeddb_perf/perf_shared.js b/tools/perf/page_sets/indexeddb_perf/perf_shared.js
index 41681e1..7536e92 100644
--- a/tools/perf/page_sets/indexeddb_perf/perf_shared.js
+++ b/tools/perf/page_sets/indexeddb_perf/perf_shared.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/indexeddb_perf/perf_test.js b/tools/perf/page_sets/indexeddb_perf/perf_test.js
index 3f264505..2569a5c 100644
--- a/tools/perf/page_sets/indexeddb_perf/perf_test.js
+++ b/tools/perf/page_sets/indexeddb_perf/perf_test.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.js
index 89276b3..423dd5a 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js
index 79b1b19f..3b5f9e0 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js
index 94fabf6..5044ef1f 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js
index 0b5b93c..e13d221 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_gradient.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_gradient.js
index 3317fa5..83f69f63 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_gradient.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_gradient.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 var backGradient;
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js
index 925dcad..6b1214ad 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_white.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_white.js
index a23608c..39b7e53b 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_white.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_back_as_white.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js
index 549564f..fc0a2f01 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_filled_path.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_filled_path.js
index 7eb267d0..c5c67b2 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_filled_path.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_filled_path.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js
index 7be8bc6..3cae13e 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js
index 0c30e66..3b33e37 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js
index e4e058b..9e426e8 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_text.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_text.js
index 079280d..49c3457 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_text.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/bouncing_balls_draw_ball_as_text.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/parse_url.js b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/parse_url.js
index 5173e346..0695987 100644
--- a/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/parse_url.js
+++ b/tools/perf/page_sets/tough_canvas_cases/canvas2d_balls_common/parse_url.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/many_images/bench.js b/tools/perf/page_sets/tough_canvas_cases/many_images/bench.js
index 4a7fee65..951bd1a 100644
--- a/tools/perf/page_sets/tough_canvas_cases/many_images/bench.js
+++ b/tools/perf/page_sets/tough_canvas_cases/many_images/bench.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/many_images/images/generate_images.sh b/tools/perf/page_sets/tough_canvas_cases/many_images/images/generate_images.sh
index 2c67f57..60ab459 100755
--- a/tools/perf/page_sets/tough_canvas_cases/many_images/images/generate_images.sh
+++ b/tools/perf/page_sets/tough_canvas_cases/many_images/images/generate_images.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Copyright 2012 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/page_sets/tough_canvas_cases/many_images/sprites.js b/tools/perf/page_sets/tough_canvas_cases/many_images/sprites.js
index 283c2b3..e483084 100644
--- a/tools/perf/page_sets/tough_canvas_cases/many_images/sprites.js
+++ b/tools/perf/page_sets/tough_canvas_cases/many_images/sprites.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/perf.isolate b/tools/perf/perf.isolate
index edadae2..49f22c82 100644
--- a/tools/perf/perf.isolate
+++ b/tools/perf/perf.isolate
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 {
diff --git a/tools/perf/record_wpr b/tools/perf/record_wpr
index 706849e9..11db147 100755
--- a/tools/perf/record_wpr
+++ b/tools/perf/record_wpr
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Copyright 2012 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 import os
diff --git a/tools/perf/run_benchmark b/tools/perf/run_benchmark
index d35126b..8f7a8a91a 100755
--- a/tools/perf/run_benchmark
+++ b/tools/perf/run_benchmark
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Copyright 2013 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/update_reference_build.py b/tools/perf/update_reference_build.py
index 04cec860..d7380ee 100755
--- a/tools/perf/update_reference_build.py
+++ b/tools/perf/update_reference_build.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 #
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Copyright 2013 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/perf/utils/results_viewer/src/base.js b/tools/perf/utils/results_viewer/src/base.js
index df65c760..deddaa8 100644
--- a/tools/perf/utils/results_viewer/src/base.js
+++ b/tools/perf/utils/results_viewer/src/base.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/perf/utils/results_viewer/src/main.css b/tools/perf/utils/results_viewer/src/main.css
index 8bb8729d..daae1f6 100644
--- a/tools/perf/utils/results_viewer/src/main.css
+++ b/tools/perf/utils/results_viewer/src/main.css
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012 The Chromium Authors. All rights reserved.
+ * Copyright 2012 The Chromium Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
diff --git a/tools/perf/utils/results_viewer/src/main.js b/tools/perf/utils/results_viewer/src/main.js
index a889387..2564a941 100644
--- a/tools/perf/utils/results_viewer/src/main.js
+++ b/tools/perf/utils/results_viewer/src/main.js
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012 The Chromium Authors. All rights reserved.
+ * Copyright 2012 The Chromium Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
diff --git a/tools/perf/utils/results_viewer/src/results_viewer.html b/tools/perf/utils/results_viewer/src/results_viewer.html
index 64554ba6..2c29727 100644
--- a/tools/perf/utils/results_viewer/src/results_viewer.html
+++ b/tools/perf/utils/results_viewer/src/results_viewer.html
@@ -1,5 +1,5 @@
 <!--
-Copyright (c) 2012 The Chromium Authors. All rights reserved.
+Copyright 2012 The Chromium Authors. All rights reserved.
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
diff --git a/tools/perf/utils/results_viewer/src/results_viewer.js b/tools/perf/utils/results_viewer/src/results_viewer.js
index 06783c4..5cad069e 100644
--- a/tools/perf/utils/results_viewer/src/results_viewer.js
+++ b/tools/perf/utils/results_viewer/src/results_viewer.js
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012 The Chromium Authors. All rights reserved.
+ * Copyright 2012 The Chromium Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
diff --git a/tools/perf/utils/results_viewer/src/ui.js b/tools/perf/utils/results_viewer/src/ui.js
index 576e87b..9598dbc 100644
--- a/tools/perf/utils/results_viewer/src/ui.js
+++ b/tools/perf/utils/results_viewer/src/ui.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/actions/scroll.js b/tools/telemetry/telemetry/internal/actions/scroll.js
index 1e903de4..1a295d0 100644
--- a/tools/telemetry/telemetry/internal/actions/scroll.js
+++ b/tools/telemetry/telemetry/internal/actions/scroll.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/browser_profiles/content_scripts1/Default/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/script.js b/tools/telemetry/telemetry/internal/browser_profiles/content_scripts1/Default/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/script.js
index 01c9ed86..afc1cf8 100644
--- a/tools/telemetry/telemetry/internal/browser_profiles/content_scripts1/Default/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/script.js
+++ b/tools/telemetry/telemetry/internal/browser_profiles/content_scripts1/Default/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/script.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py b/tools/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py
index 74dac5c..4214add 100644
--- a/tools/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py
+++ b/tools/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py
@@ -133,7 +133,12 @@
       logging.info('Cannot monitor power: pre-Sandy Bridge CPU.')
       return False
 
-    return self._CheckMSRs()
+    try:
+      return self._CheckMSRs()
+    finally:
+      # Since _CheckMSRs() starts the MSR server on win platform, we must close
+      # it after checking to avoid leaking msr server process.
+      self._backend.CloseMsrServer()
 
   def StopMonitoringPower(self):
     power_statistics = super(MsrPowerMonitorWin, self).StopMonitoringPower()
diff --git a/tools/telemetry/telemetry/internal/platform/profiler/win_pgo_profiler.py b/tools/telemetry/telemetry/internal/platform/profiler/win_pgo_profiler.py
index 664749b1b..163e9e6 100644
--- a/tools/telemetry/telemetry/internal/platform/profiler/win_pgo_profiler.py
+++ b/tools/telemetry/telemetry/internal/platform/profiler/win_pgo_profiler.py
@@ -31,7 +31,6 @@
            ' this.' % _PGOSWEEP_EXECUTABLE)
 
     self._browser_dir = browser_backend.browser_directory
-    self._chrome_pgc_counter = self._GetNextProfileIndex('chrome')
     self._chrome_child_pgc_counter = self._GetNextProfileIndex('chrome_child')
 
   def _GetNextProfileIndex(self, dll_name):
@@ -93,9 +92,4 @@
                                               'chrome_child',
                                               self._chrome_child_pgc_counter))
         self._chrome_child_pgc_counter += 1
-      elif 'browser0' in output_file:
-        output_files.append(self._RunPGOSweep(pid,
-                                              'chrome',
-                                              self._chrome_pgc_counter))
-        self._chrome_pgc_counter += 1
     return output_files
diff --git a/tools/telemetry/telemetry/internal/results/buildbot_output_formatter.py b/tools/telemetry/telemetry/internal/results/buildbot_output_formatter.py
index 4a644ab..4a48d1b 100644
--- a/tools/telemetry/telemetry/internal/results/buildbot_output_formatter.py
+++ b/tools/telemetry/telemetry/internal/results/buildbot_output_formatter.py
@@ -9,9 +9,9 @@
 from telemetry.value import summary as summary_module
 
 
+@decorators.Deprecated(2016, 2, 29, 'Chart JSON is a supported alternative. '
+                       'See https://goo.gl/8daFav .')
 class BuildbotOutputFormatter(output_formatter.OutputFormatter):
-  @decorators.Deprecated(2016, 2, 29, 'Chart JSON is a supported alternative. '
-                         'See https://goo.gl/8daFav .')
   def __init__(self, output_stream, trace_tag=''):
     super(BuildbotOutputFormatter, self).__init__(output_stream)
     self._trace_tag = trace_tag
diff --git a/tools/telemetry/telemetry/internal/testing/component_extension/background.js b/tools/telemetry/telemetry/internal/testing/component_extension/background.js
index 28b5760..303ef9f 100644
--- a/tools/telemetry/telemetry/internal/testing/component_extension/background.js
+++ b/tools/telemetry/telemetry/internal/testing/component_extension/background.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/dog/dog/dog_object.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/dog/dog/dog_object.py
index eeca8b4..dfba650b 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/dog/dog/dog_object.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/dog/dog/dog_object.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/__init__.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/__init__.py
index 047b03c..50b23df 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/__init__.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/__init__.py
@@ -1,3 +1,3 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/cat_object.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/cat_object.py
index 4e18a92..41be7ba 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/cat_object.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/cat/cat/cat_object.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/__init__.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/__init__.py
index 047b03c..50b23df 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/__init__.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/__init__.py
@@ -1,3 +1,3 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/__init__.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/__init__.py
index 047b03c..50b23df 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/__init__.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/__init__.py
@@ -1,3 +1,3 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/horn_object.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/horn_object.py
index b0757f5d..1a883ef 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/horn_object.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/horn/horn_object.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/moose_object.py b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/moose_object.py
index 2bdac5e..1e87ea4 100644
--- a/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/moose_object.py
+++ b/tools/telemetry/telemetry/internal/testing/dependency_test_dir/other_animals/moose/moose/moose_object.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/internal/testing/simple_extension/background.js b/tools/telemetry/telemetry/internal/testing/simple_extension/background.js
index 28b5760..303ef9f 100644
--- a/tools/telemetry/telemetry/internal/testing/simple_extension/background.js
+++ b/tools/telemetry/telemetry/internal/testing/simple_extension/background.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py b/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py
index 664a8d8..7f7bfdc9 100644
--- a/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py
+++ b/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py
@@ -266,7 +266,7 @@
     threads_to_records_map = _GetRendererThreadsToInteractionRecordsMap(model)
     if (len(threads_to_records_map.values()) == 0 and
         self._tbm_options.tracing_options.enable_chrome_trace):
-      raise story_test.Failure(
+      logging.warning(
           'No timeline interaction records were recorded in the trace. '
           'This could be caused by console.time() & console.timeEnd() execution'
           ' failure or the tracing category specified doesn\'t include '
diff --git a/tools/telemetry/telemetry/web_perf/timeline_based_page_test.py b/tools/telemetry/telemetry/web_perf/timeline_based_page_test.py
index d517de37..fdde37a 100644
--- a/tools/telemetry/telemetry/web_perf/timeline_based_page_test.py
+++ b/tools/telemetry/telemetry/web_perf/timeline_based_page_test.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
diff --git a/tools/telemetry/telemetry/web_perf/timeline_based_page_test_unittest.py b/tools/telemetry/telemetry/web_perf/timeline_based_page_test_unittest.py
index d6865f92..7ea5241d 100644
--- a/tools/telemetry/telemetry/web_perf/timeline_based_page_test_unittest.py
+++ b/tools/telemetry/telemetry/web_perf/timeline_based_page_test_unittest.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Copyright 2015 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
@@ -129,16 +129,3 @@
     v = results.FindAllPageSpecificValuesFromIRNamed(
         'Gesture_Scroll', 'frame_time_discrepancy')
     self.assertEquals(len(v), 1)
-
-  @decorators.Disabled('chromeos')  # crbug.com/483212.
-  def testTimelineBasedMeasurementWithNoInteractionRecord(self):
-    ps = self.CreateEmptyPageSet()
-    ps.AddStory(TestTimelinebasedMeasurementPage(
-        ps, ps.base_dir, trigger_scroll_gesture=True))
-
-    option = tbm_module.Options(
-        tracing_category_filter.TracingCategoryFilter('cc'))
-    tbm = tbm_module.TimelineBasedMeasurement(option)
-    results = self.RunMeasurement(tbm, ps, options=self._options)
-    self.assertEquals(1, len(results.failures))
-    self.assertIn('No timeline interaction records', str(results.failures[0]))
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index 286aa74..9eff64f 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -202,8 +202,6 @@
     "touch/touch_device.h",
     "touch/touch_editing_controller.cc",
     "touch/touch_editing_controller.h",
-    "touch/touch_enabled.cc",
-    "touch/touch_enabled.h",
     "ui_base_export.h",
     "ui_base_exports.cc",
     "ui_base_paths.cc",
diff --git a/ui/base/touch/touch_enabled.cc b/ui/base/touch/touch_enabled.cc
deleted file mode 100644
index 89d3eac..0000000
--- a/ui/base/touch/touch_enabled.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/touch/touch_enabled.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "ui/base/touch/touch_device.h"
-#include "ui/base/ui_base_switches.h"
-#include "ui/events/event_switches.h"
-
-namespace ui {
-
-bool AreTouchEventsEnabled() {
-  const base::CommandLine& command_line =
-      *base::CommandLine::ForCurrentProcess();
-  const std::string touch_enabled_switch =
-      command_line.HasSwitch(switches::kTouchEvents) ?
-      command_line.GetSwitchValueASCII(switches::kTouchEvents) :
-      switches::kTouchEventsAuto;
-
-  if (touch_enabled_switch.empty() ||
-      touch_enabled_switch == switches::kTouchEventsEnabled)
-    return true;
-  if (touch_enabled_switch == switches::kTouchEventsAuto)
-    return IsTouchDevicePresent();
-  if (touch_enabled_switch != switches::kTouchEventsDisabled)
-    LOG(ERROR) << "Invalid --touch-events option: " << touch_enabled_switch;
-  return false;
-}
-
-}  // namespace ui
diff --git a/ui/base/touch/touch_enabled.h b/ui/base/touch/touch_enabled.h
deleted file mode 100644
index 88837d78..0000000
--- a/ui/base/touch/touch_enabled.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_TOUCH_TOUCH_ENABLED_H_
-#define UI_BASE_TOUCH_TOUCH_ENABLED_H_
-
-#include "ui/base/ui_base_export.h"
-
-namespace ui {
-
-// Returns true if the touch-enabled flag is enabled, or if it is set to auto
-// and a touch device is present.
-UI_BASE_EXPORT bool AreTouchEventsEnabled();
-
-}  // namespace ui
-
-#endif  // UI_BASE_TOUCH_TOUCH_ENABLED_H_
diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp
index 565faed3..d18c1f1e 100644
--- a/ui/base/ui_base.gyp
+++ b/ui/base/ui_base.gyp
@@ -291,8 +291,6 @@
         'touch/touch_device_win.cc',
         'touch/touch_editing_controller.cc',
         'touch/touch_editing_controller.h',
-        'touch/touch_enabled.cc',
-        'touch/touch_enabled.h',
         'ui_base_export.h',
         'ui_base_exports.cc',
         'ui_base_paths.cc',
diff --git a/ui/events/base_event_utils.cc b/ui/events/base_event_utils.cc
index ffff0f1da..622d2f2 100644
--- a/ui/events/base_event_utils.cc
+++ b/ui/events/base_event_utils.cc
@@ -5,19 +5,47 @@
 #include "ui/events/base_event_utils.h"
 
 #include "base/atomic_sequence_num.h"
+#include "base/command_line.h"
 #include "base/logging.h"
 #include "ui/events/event_constants.h"
+#include "ui/events/event_switches.h"
 
 namespace ui {
 
 namespace {
 
 #if defined(OS_CHROMEOS)
+// Determines whether touch events are enabled or disabled on ChromeOS only.
+bool touch_events_enabled = true;
+
 const int kSystemKeyModifierMask = EF_ALT_DOWN | EF_COMMAND_DOWN;
 #else
 const int kSystemKeyModifierMask = EF_ALT_DOWN;
-#endif  // defined(OS_CHROMEOS)
 
+// Retrieves the status of the touch screen events from the command line on Non-
+// ChromeOS platforms.
+bool ComputeTouchStatus() {
+  const base::CommandLine& command_line =
+      *base::CommandLine::ForCurrentProcess();
+  const std::string touch_enabled_switch =
+      command_line.HasSwitch(switches::kTouchEvents) ?
+      command_line.GetSwitchValueASCII(switches::kTouchEvents) :
+      switches::kTouchEventsAuto;
+
+  if (touch_enabled_switch.empty() ||
+      touch_enabled_switch == switches::kTouchEventsEnabled ||
+      touch_enabled_switch == switches::kTouchEventsAuto) {
+    return true;
+  }
+
+  if (touch_enabled_switch == switches::kTouchEventsDisabled)
+    return false;
+
+  LOG(ERROR) << "Invalid --touch-events option: " << touch_enabled_switch;
+  return false;
+}
+
+#endif  // defined(OS_CHROMEOS)
 
 }  // namespace
 
@@ -40,5 +68,22 @@
          (EF_ALTGR_DOWN & flags) == 0;
 }
 
+#if defined(OS_CHROMEOS)
+
+void SetTouchEventsEnabled(bool enabled) {
+  touch_events_enabled = enabled;
+}
+
+#endif  // defined(OS_CHROMEOS)
+
+bool AreTouchEventsEnabled() {
+#if defined(OS_CHROMEOS)
+  return touch_events_enabled;
+#else
+  static bool touch_events_enabled = ComputeTouchStatus();
+  return touch_events_enabled;
+#endif  // !defined(OS_CHROMEOS)
+}
+
 }  // namespace ui
 
diff --git a/ui/events/base_event_utils.h b/ui/events/base_event_utils.h
index c353c61..f659580 100644
--- a/ui/events/base_event_utils.h
+++ b/ui/events/base_event_utils.h
@@ -17,6 +17,16 @@
 // Checks if |flags| contains system key modifiers.
 EVENTS_BASE_EXPORT bool IsSystemKeyModifier(int flags);
 
+#if defined(OS_CHROMEOS)
+// Sets the status of touch events to |enabled| on ChromeOS only. Non-ChromeOS
+// platforms depend on the state of the |kTouchEvents| flags.
+EVENTS_BASE_EXPORT void SetTouchEventsEnabled(bool enabled);
+#endif  // defined(OS_CHROMEOS)
+
+// Returns true if the touch events are enabled. On non-ChromeOS platforms, this
+// depends on the state of the |kTouchEvents| flags.
+EVENTS_BASE_EXPORT bool AreTouchEventsEnabled();
+
 }  // namespace ui
 
 #endif  // UI_EVENTS_BASE_EVENT_UTILS_H_
diff --git a/ui/events/devices/x11/device_data_manager_x11.cc b/ui/events/devices/x11/device_data_manager_x11.cc
index dc839df..e0216204 100644
--- a/ui/events/devices/x11/device_data_manager_x11.cc
+++ b/ui/events/devices/x11/device_data_manager_x11.cc
@@ -742,6 +742,10 @@
   }
 }
 
+bool DeviceDataManagerX11::IsDeviceEnabled(int device_id) const {
+  return blocked_devices_.test(device_id);
+}
+
 bool DeviceDataManagerX11::IsEventBlocked(
     const base::NativeEvent& native_event) {
   // Only check XI2 events which have a source device id.
diff --git a/ui/events/devices/x11/device_data_manager_x11.h b/ui/events/devices/x11/device_data_manager_x11.h
index c8e29f5..314946be 100644
--- a/ui/events/devices/x11/device_data_manager_x11.h
+++ b/ui/events/devices/x11/device_data_manager_x11.h
@@ -240,6 +240,8 @@
   void DisableDevice(int deviceid);
   void EnableDevice(int deviceid);
 
+  bool IsDeviceEnabled(int device_id) const;
+
   // Returns true if |native_event| should be blocked.
   bool IsEventBlocked(const base::NativeEvent& native_event);
 
diff --git a/ui/events/devices/x11/touch_factory_x11.cc b/ui/events/devices/x11/touch_factory_x11.cc
index 35489cd..d0cc9916 100644
--- a/ui/events/devices/x11/touch_factory_x11.cc
+++ b/ui/events/devices/x11/touch_factory_x11.cc
@@ -19,6 +19,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/sys_info.h"
+#include "ui/events/base_event_utils.h"
 #include "ui/events/devices/x11/device_data_manager_x11.h"
 #include "ui/events/devices/x11/device_list_cache_x11.h"
 #include "ui/events/event_switches.h"
@@ -28,7 +29,6 @@
 
 TouchFactory::TouchFactory()
     : pointer_device_lookup_(),
-      touch_events_disabled_(false),
       touch_device_list_(),
       virtual_core_keyboard_device_(-1),
       id_generator_(0) {
@@ -37,11 +37,6 @@
 
   XDisplay* display = gfx::GetXDisplay();
   UpdateDeviceList(display);
-
-  base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
-  touch_events_disabled_ = cmdline->HasSwitch(switches::kTouchEvents) &&
-      cmdline->GetSwitchValueASCII(switches::kTouchEvents) ==
-          switches::kTouchEventsDisabled;
 }
 
 TouchFactory::~TouchFactory() {
@@ -164,7 +159,7 @@
     bool is_from_master_or_float = touch_device_list_[xiev->deviceid];
     bool is_from_slave_device = !is_from_master_or_float
         && xiev->sourceid == xiev->deviceid;
-    return !touch_events_disabled_ &&
+    return ui::AreTouchEventsEnabled() &&
            IsTouchDevice(xiev->deviceid) &&
            !is_from_slave_device;
   }
@@ -177,13 +172,14 @@
 
   if (event->evtype != XI_ButtonPress &&
       event->evtype != XI_ButtonRelease &&
-      event->evtype != XI_Motion)
+      event->evtype != XI_Motion) {
     return true;
+  }
 
   if (!pointer_device_lookup_[xiev->deviceid])
     return false;
 
-  return IsTouchDevice(xiev->deviceid) ? !touch_events_disabled_ : true;
+  return IsTouchDevice(xiev->deviceid) ? ui::AreTouchEventsEnabled() : true;
 }
 
 void TouchFactory::SetupXI2ForXWindow(Window window) {
@@ -270,13 +266,12 @@
 }
 
 bool TouchFactory::IsTouchDevicePresent() {
-  return !touch_events_disabled_ && touch_device_lookup_.any();
+  return ui::AreTouchEventsEnabled() && touch_device_lookup_.any();
 }
 
 void TouchFactory::ResetForTest() {
   pointer_device_lookup_.reset();
   touch_device_lookup_.reset();
-  touch_events_disabled_ = false;
   touch_device_list_.clear();
   touchscreen_ids_.clear();
   id_generator_.ResetForTest();
@@ -292,7 +287,6 @@
     touch_device_lookup_[*iter] = true;
     touch_device_list_[*iter] = true;
   }
-  touch_events_disabled_ = false;
 }
 
 void TouchFactory::SetPointerDeviceForTest(
diff --git a/ui/events/devices/x11/touch_factory_x11.h b/ui/events/devices/x11/touch_factory_x11.h
index 85e4a58..eb2620b 100644
--- a/ui/events/devices/x11/touch_factory_x11.h
+++ b/ui/events/devices/x11/touch_factory_x11.h
@@ -119,9 +119,6 @@
   // A quick lookup table for determining if a device is a touch device.
   std::bitset<kMaxDeviceNum> touch_device_lookup_;
 
-  // Indicates whether touch events are explicitly disabled.
-  bool touch_events_disabled_;
-
   // The list of touch devices. For testing/debugging purposes, a single-pointer
   // device (mouse or touch screen without sufficient X/driver support for MT)
   // can sometimes be treated as a touch device. The key in the map represents
diff --git a/ui/events/ozone/evdev/input_controller_evdev.cc b/ui/events/ozone/evdev/input_controller_evdev.cc
index a1c7f2ad..42460962 100644
--- a/ui/events/ozone/evdev/input_controller_evdev.cc
+++ b/ui/events/ozone/evdev/input_controller_evdev.cc
@@ -92,6 +92,15 @@
   ScheduleUpdateDeviceSettings();
 }
 
+bool InputControllerEvdev::IsInternalTouchpadEnabled() const {
+  return input_device_settings_.enable_internal_touchpad;
+}
+
+void InputControllerEvdev::SetTouchscreensEnabled(bool enabled) {
+  input_device_settings_.enable_touch_screens = enabled;
+  ScheduleUpdateDeviceSettings();
+}
+
 void InputControllerEvdev::SetTouchEventLoggingEnabled(bool enabled) {
   input_device_settings_.touch_event_logging_enabled = enabled;
   ScheduleUpdateDeviceSettings();
diff --git a/ui/events/ozone/evdev/input_controller_evdev.h b/ui/events/ozone/evdev/input_controller_evdev.h
index c824f5e..9ee4cf7 100644
--- a/ui/events/ozone/evdev/input_controller_evdev.h
+++ b/ui/events/ozone/evdev/input_controller_evdev.h
@@ -62,6 +62,8 @@
   void GetTouchEventLog(const base::FilePath& out_dir,
                         const GetTouchEventLogReply& reply) override;
   void SetInternalTouchpadEnabled(bool enabled) override;
+  bool IsInternalTouchpadEnabled() const override;
+  void SetTouchscreensEnabled(bool enabled) override;
   void SetInternalKeyboardFilter(bool enable_filter,
                                  std::vector<DomCode> allowed_keys) override;
 
diff --git a/ui/events/ozone/evdev/input_device_factory_evdev.cc b/ui/events/ozone/evdev/input_device_factory_evdev.cc
index 73e16c6..1bf91146 100644
--- a/ui/events/ozone/evdev/input_device_factory_evdev.cc
+++ b/ui/events/ozone/evdev/input_device_factory_evdev.cc
@@ -367,6 +367,10 @@
       converter->HasTouchpad())
     return false;
 
+  if (!input_device_settings_.enable_touch_screens &&
+      converter->HasTouchscreen())
+    return false;
+
   return input_device_settings_.enable_devices;
 }
 
diff --git a/ui/events/ozone/evdev/input_device_settings_evdev.h b/ui/events/ozone/evdev/input_device_settings_evdev.h
index 0665f64..1be7637e 100644
--- a/ui/events/ozone/evdev/input_device_settings_evdev.h
+++ b/ui/events/ozone/evdev/input_device_settings_evdev.h
@@ -32,6 +32,7 @@
 
   bool enable_devices = true;  // If false, all input is disabled.
   bool enable_internal_touchpad = true;
+  bool enable_touch_screens = true;
   bool enable_internal_keyboard_filter = false;
   std::vector<DomCode> internal_keyboard_allowed_keys;
 };
diff --git a/ui/file_manager/file_manager/background/js/test_util_base.js b/ui/file_manager/file_manager/background/js/test_util_base.js
index 2c82140..772e48d 100644
--- a/ui/file_manager/file_manager/background/js/test_util_base.js
+++ b/ui/file_manager/file_manager/background/js/test_util_base.js
@@ -276,18 +276,21 @@
 };
 
 /**
- * Sends an event to the element specified by |targetQuery|.
+ * Sends an event to the element specified by |targetQuery| or active element.
  *
  * @param {Window} contentWindow Window to be tested.
- * @param {string} targetQuery Query to specify the element.
+ * @param {?string} targetQuery Query to specify the element. If this value is
+ *     null, an event is dispatched to active element of the document.
  * @param {!Event} event Event to be sent.
  * @param {string=} opt_iframeQuery Optional iframe selector.
  * @return {boolean} True if the event is sent to the target, false otherwise.
  */
 test.util.sync.sendEvent = function(
     contentWindow, targetQuery, event, opt_iframeQuery) {
-  var target = test.util.sync.getElement_(
-      contentWindow, targetQuery, opt_iframeQuery);
+  var target = targetQuery === null ?
+      contentWindow.document.activeElement :
+      test.util.sync.getElement_(contentWindow, targetQuery, opt_iframeQuery);
+
   if (!target)
     return false;
 
@@ -320,11 +323,12 @@
 };
 
 /**
- * Sends a fake key event to the element specified by |targetQuery| with the
- * given |keyIdentifier| and optional |ctrl| modifier to the file manager.
+ * Sends a fake key event to the element specified by |targetQuery| or active
+ * element with the given |keyIdentifier| and optional |ctrl| modifier.
  *
  * @param {Window} contentWindow Window to be tested.
- * @param {string} targetQuery Query to specify the element.
+ * @param {?string} targetQuery Query to specify the element. If this value is
+ *     null, key event is dispatched to active element of the document.
  * @param {string} keyIdentifier Identifier of the emulated key.
  * @param {boolean} ctrl Whether CTRL should be pressed, or not.
  * @param {boolean} shift whether SHIFT should be pressed, or not.
diff --git a/ui/file_manager/gallery/js/gallery.js b/ui/file_manager/gallery/js/gallery.js
index 499130a..d062397 100644
--- a/ui/file_manager/gallery/js/gallery.js
+++ b/ui/file_manager/gallery/js/gallery.js
@@ -428,6 +428,7 @@
         // Do the initialization for each mode.
         if (shouldShowThumbnail) {
           self.thumbnailMode_.show();
+          self.thumbnailMode_.focus();
         } else {
           self.slideMode_.enter(
               null,
diff --git a/ui/file_manager/integration_tests/gallery/open_image_files.js b/ui/file_manager/integration_tests/gallery/open_image_files.js
index 974f8ec..49d37f6 100644
--- a/ui/file_manager/integration_tests/gallery/open_image_files.js
+++ b/ui/file_manager/integration_tests/gallery/open_image_files.js
@@ -59,6 +59,30 @@
 }
 
 /**
+ * Confirms that two images are loaded in thumbnail mode. This method doesn't
+ * care whether two images are loaded with error or not.
+ *
+ * @param {string} appId
+ * @return {Promise} Promise to be fulfilled with on success.
+ */
+function confirmTwoImagesAreLoadedInThumbnailMode(appId) {
+  // Wait until Gallery changes to thumbnail mode.
+  return gallery.waitForElement(
+      appId, '.gallery[mode="thumbnail"]').then(function() {
+    // Confirm that two tiles are shown.
+    return repeatUntil(function() {
+      return gallery.callRemoteTestUtil('queryAllElements', appId,
+          ['.thumbnail-view .thumbnail']).then(function(tiles) {
+        if (tiles.length !== 2)
+          return pending('The number of tiles is expected 2, but is %d',
+              tiles.length);
+        return tiles;
+      });
+    });
+  });
+}
+
+/**
  * Runs a test to open multiple images.
  *
  * @param {string} testVolumeName Test volume name passed to the addEntries
@@ -71,21 +95,31 @@
   var launchedPromise = launch(testVolumeName, volumeType, testEntries);
   return launchedPromise.then(function(args) {
     var appId = args.appId;
-    var rootElementPromise =
-        gallery.waitForElement(appId, '.gallery[mode="thumbnail"]');
-    var tilesPromise = repeatUntil(function() {
+    return confirmTwoImagesAreLoadedInThumbnailMode(appId);
+  });
+}
+
+/**
+ * Runs a test to open multiple images and change to slide mode with keyboard.
+ *
+ * @param {string} testVolumeName Test volume name passed to the addEntries
+ *     function. Either 'drive' or 'local'.
+ * @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
+ * @return {Promise} Promise to be fulfilled with on success.
+ */
+function openMultipleImagesAndChangeToSlideMode(testVolumeName, volumeType) {
+  var testEntries = [ENTRIES.desktop, ENTRIES.image3];
+  var launchedPromise = launch(testVolumeName, volumeType, testEntries);
+  return launchedPromise.then(function(args) {
+    var appId = args.appId;
+    return confirmTwoImagesAreLoadedInThumbnailMode(appId).then(function() {
+      // Press Enter key and mode should be changed to slide mode.
       return gallery.callRemoteTestUtil(
-          'queryAllElements',
-          appId,
-          ['.thumbnail-view .thumbnail']
-      ).then(function(tiles) {
-        if (tiles.length !== 2)
-          return pending('The number of tiles is expected 2, but is %d',
-                         tiles.length);
-        return tiles;
-      });
+          'fakeKeyDown', appId, [null /* active element */, 'Enter', false]);
+    }).then(function() {
+      // Wait until it changes to slide mode.
+      return gallery.waitForElement(appId, '.gallery[mode="slide"]');
     });
-    return Promise.all([rootElementPromise, tilesPromise]);
   });
 }
 
@@ -120,3 +154,11 @@
 testcase.openMultipleImagesOnDrive = function() {
   return openMultipleImages('drive', 'drive');
 };
+
+/**
+ * The openMultipleImagesAndChangeToSlideMode test for Downloads.
+ * @return {Promise} Promise to be fulfilled with on success.
+ */
+testcase.openMultipleImagesAndChangeToSlideModeOnDownloads = function() {
+  return openMultipleImagesAndChangeToSlideMode('local', 'downloads');
+};
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index a5da7e9..606d70e 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -434,11 +434,14 @@
     "vector_icons/blocked_badge.icon",
     "vector_icons/browser_tools.1x.icon",
     "vector_icons/browser_tools.icon",
+    "vector_icons/business.icon",
     "vector_icons/check_circle.icon",
     "vector_icons/chrome_product.icon",
     "vector_icons/code.icon",
     "vector_icons/cookie.icon",
     "vector_icons/crashed_tab.icon",
+    "vector_icons/credit_card.1x.icon",
+    "vector_icons/credit_card.icon",
     "vector_icons/error_circle.icon",
     "vector_icons/extension.icon",
     "vector_icons/extension_crashed.icon",
@@ -463,6 +466,12 @@
     "vector_icons/keyword_search.1x.icon",
     "vector_icons/keyword_search.icon",
     "vector_icons/laptop.icon",
+    "vector_icons/location_bar_http.1x.icon",
+    "vector_icons/location_bar_http.icon",
+    "vector_icons/location_bar_https_invalid.1x.icon",
+    "vector_icons/location_bar_https_invalid.icon",
+    "vector_icons/location_bar_https_valid.1x.icon",
+    "vector_icons/location_bar_https_valid.icon",
     "vector_icons/location_bar_star.icon",
     "vector_icons/location_bar_star_active.icon",
     "vector_icons/location_on.icon",
diff --git a/ui/gfx/OWNERS b/ui/gfx/OWNERS
index 3c51f44..55d39e7f 100644
--- a/ui/gfx/OWNERS
+++ b/ui/gfx/OWNERS
@@ -27,3 +27,4 @@
 
 # If you're doing structural changes get a review from one of the OWNERS.
 per-file *.gyp*=*
+per-file BUILD.gn=*
diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc
index b81f995d..cd769000 100644
--- a/ui/gfx/canvas.cc
+++ b/ui/gfx/canvas.cc
@@ -14,6 +14,7 @@
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/safe_integer_conversions.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/gfx/scoped_canvas.h"
@@ -303,6 +304,13 @@
                          SkIntToScalar(radius), paint);
 }
 
+void Canvas::DrawRoundRect(const RectF& rect,
+                           float radius,
+                           const SkPaint& paint) {
+  canvas_->drawRoundRect(RectFToSkRect(rect), SkFloatToScalar(radius),
+                         SkFloatToScalar(radius), paint);
+}
+
 void Canvas::DrawPath(const SkPath& path, const SkPaint& paint) {
   canvas_->drawPath(path, paint);
 }
diff --git a/ui/gfx/canvas.h b/ui/gfx/canvas.h
index fd6e3c71..d154962 100644
--- a/ui/gfx/canvas.h
+++ b/ui/gfx/canvas.h
@@ -20,6 +20,7 @@
 namespace gfx {
 
 class Rect;
+class RectF;
 class FontList;
 class Point;
 class Size;
@@ -248,9 +249,14 @@
                   const SkPaint& paint);
 
   // Draws the given rectangle with rounded corners of |radius| using the
-  // given |paint| parameters.
+  // given |paint| parameters. DEPRECATED in favor of the RectF version below.
+  // TODO(mgiuca): Remove this (http://crbug.com/553726).
   void DrawRoundRect(const Rect& rect, int radius, const SkPaint& paint);
 
+  // Draws the given rectangle with rounded corners of |radius| using the
+  // given |paint| parameters.
+  void DrawRoundRect(const RectF& rect, float radius, const SkPaint& paint);
+
   // Draws the given path using the given |paint| parameters.
   void DrawPath(const SkPath& path, const SkPaint& paint);
 
diff --git a/ui/gfx/icon_util.cc b/ui/gfx/icon_util.cc
index f9758d3..4fdc878 100644
--- a/ui/gfx/icon_util.cc
+++ b/ui/gfx/icon_util.cc
@@ -49,42 +49,36 @@
   DCHECK(resized_image_family);
   DCHECK(resized_image_family->empty());
 
+  // Determine whether there is an image bigger than 48x48 (kMediumIconSize).
+  const gfx::Image* biggest =
+      image_family.GetBest(IconUtil::kLargeIconSize, IconUtil::kLargeIconSize);
+  if (!biggest || biggest->IsEmpty()) {
+    // Either |image_family| is empty, or all images have size 0x0.
+    return false;
+  }
+
+  bool has_bigger_than_medium = biggest->Width() > IconUtil::kMediumIconSize ||
+                                biggest->Height() > IconUtil::kMediumIconSize;
+
   for (size_t i = 0; i < IconUtil::kNumIconDimensions; ++i) {
     int dimension = IconUtil::kIconDimensions[i];
-    gfx::Size size(dimension, dimension);
-    const gfx::Image* best = image_family.GetBest(size);
-    if (!best || best->IsEmpty()) {
-      // Either |image_family| is empty, or all images have size 0x0.
+    // Windows' "Large icons" view displays icons at full size only if there is
+    // a 256x256 (kLargeIconSize) image in the .ico file. Otherwise, it shrinks
+    // icons to 48x48 (kMediumIconSize). Therefore, if there is no source icon
+    // larger than 48x48, do not create any images larger than 48x48.
+    // kIconDimensions is sorted in ascending order, so it is safe to break
+    // here.
+    if (!has_bigger_than_medium && dimension > IconUtil::kMediumIconSize)
+      break;
+
+    gfx::Image resized = image_family.CreateExact(dimension, dimension);
+    if (resized.IsEmpty()) {
+      // An error occurred in CreateExact (typically because the image had the
+      // wrong pixel format).
       return false;
     }
 
-    // Optimize for the "Large icons" view in Windows Vista+. This view displays
-    // icons at full size if only if there is a 256x256 (kLargeIconSize) image
-    // in the .ico file. Otherwise, it shrinks icons to 48x48 (kMediumIconSize).
-    if (dimension > IconUtil::kMediumIconSize &&
-        best->Width() <= IconUtil::kMediumIconSize &&
-        best->Height() <= IconUtil::kMediumIconSize) {
-      // There is no source icon larger than 48x48, so do not create any
-      // images larger than 48x48. kIconDimensions is sorted in ascending
-      // order, so it is safe to break here.
-      break;
-    }
-
-    if (best->Size() == size) {
-      resized_image_family->Add(*best);
-    } else {
-      // There is no |dimension|x|dimension| source image.
-      // Resize this one to the desired size, and insert it.
-      SkBitmap best_bitmap = best->AsBitmap();
-      // Only kARGB_8888 images are supported.
-      // This will also filter out images with no pixels.
-      if (best_bitmap.colorType() != kN32_SkColorType)
-        return false;
-      SkBitmap resized_bitmap = skia::ImageOperations::Resize(
-          best_bitmap, skia::ImageOperations::RESIZE_LANCZOS3,
-          dimension, dimension);
-      resized_image_family->Add(gfx::Image::CreateFrom1xBitmap(resized_bitmap));
-    }
+    resized_image_family->Add(resized);
   }
   return true;
 }
diff --git a/ui/gfx/image/image_family.cc b/ui/gfx/image/image_family.cc
index 04f516b8..af0c2bf3 100644
--- a/ui/gfx/image/image_family.cc
+++ b/ui/gfx/image/image_family.cc
@@ -6,6 +6,7 @@
 
 #include <cmath>
 
+#include "skia/ext/image_operations.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/image/image_skia.h"
@@ -107,6 +108,28 @@
   return GetBest(size.width(), size.height());
 }
 
+gfx::Image ImageFamily::CreateExact(int width, int height) const {
+  // Resize crashes if width or height is 0, so just return an empty image.
+  if (width == 0 || height == 0)
+    return gfx::Image();
+
+  const gfx::Image* image = GetBest(width, height);
+  if (!image)
+    return gfx::Image();
+
+  if (image->Width() == width && image->Height() == height)
+    return gfx::Image(*image);
+
+  SkBitmap bitmap = image->AsBitmap();
+  SkBitmap resized_bitmap = skia::ImageOperations::Resize(
+      bitmap, skia::ImageOperations::RESIZE_LANCZOS3, width, height);
+  return gfx::Image::CreateFrom1xBitmap(resized_bitmap);
+}
+
+gfx::Image ImageFamily::CreateExact(const gfx::Size& size) const {
+  return CreateExact(size.width(), size.height());
+}
+
 const gfx::Image* ImageFamily::GetWithExactAspect(float aspect,
                                                   int width) const {
   // Find the two images of given aspect ratio on either side of |width|.
diff --git a/ui/gfx/image/image_family.h b/ui/gfx/image/image_family.h
index c092b2a..e8920b9a 100644
--- a/ui/gfx/image/image_family.h
+++ b/ui/gfx/image/image_family.h
@@ -136,6 +136,17 @@
   // NULL.
   const gfx::Image* GetBest(const gfx::Size& size) const;
 
+  // Gets an image of size |width|x|height|. If no image of that exact size
+  // exists, chooses the nearest larger image using GetBest() and scales it to
+  // the desired size. If there are no images in the family, returns an empty
+  // image.
+  gfx::Image CreateExact(int width, int height) const;
+
+  // Gets an image of size |size|. If no image of that exact size exists,
+  // chooses the nearest larger image using GetBest() and scales it to the
+  // desired size. If there are no images in the family, returns an empty image.
+  gfx::Image CreateExact(const gfx::Size& size) const;
+
  private:
   // Find the closest aspect ratio in the map to |desired_aspect|.
   // Ties are broken by the thinner aspect.
diff --git a/ui/gfx/image/image_family_unittest.cc b/ui/gfx/image/image_family_unittest.cc
index 20167c6b3..88d5298 100644
--- a/ui/gfx/image/image_family_unittest.cc
+++ b/ui/gfx/image/image_family_unittest.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/image/image_family.h"
 #include "ui/gfx/image/image_skia.h"
@@ -23,6 +25,17 @@
   EXPECT_EQ(expected_height, image_->Height()); \
 } while(0)
 
+// Tests that |image| has the given width and height.
+// This is a macro instead of a function, so that the correct line numbers are
+// reported when a test fails.
+#define EXPECT_IMAGE_SIZE(image, expected_width, expected_height) \
+do { \
+  const gfx::Image& image_ = image; \
+  EXPECT_FALSE(image_.IsEmpty()); \
+  EXPECT_EQ(expected_width, image_.Width()); \
+  EXPECT_EQ(expected_height, image_.Height()); \
+} while(0)
+
 class ImageFamilyTest : public testing::Test {
  public:
   // Construct an ImageFamily. Implicitly tests Add and Empty.
@@ -92,7 +105,7 @@
   EXPECT_TRUE(it == end);
 }
 
-TEST_F(ImageFamilyTest, Get) {
+TEST_F(ImageFamilyTest, GetBest) {
   // Get on an empty family.
   gfx::ImageFamily empty_family;
   EXPECT_TRUE(empty_family.empty());
@@ -151,6 +164,54 @@
   EXPECT_IMAGE_NON_NULL_AND_SIZE(image_family_.GetBest(654, 129), 512, 128);
 }
 
+TEST_F(ImageFamilyTest, CreateExact) {
+  // CreateExact on an empty family.
+  gfx::ImageFamily empty_family;
+  EXPECT_TRUE(empty_family.empty());
+  EXPECT_TRUE(empty_family.CreateExact(32, 32).IsEmpty());
+  EXPECT_TRUE(empty_family.CreateExact(0, 32).IsEmpty());
+  EXPECT_TRUE(empty_family.CreateExact(32, 0).IsEmpty());
+
+  // CreateExact on a family with only empty images results in an empty image,
+  // despite the requested image size.
+  gfx::ImageFamily family_with_empty_image;
+  family_with_empty_image.Add(gfx::Image());
+  EXPECT_FALSE(family_with_empty_image.empty());
+  EXPECT_TRUE(family_with_empty_image.CreateExact(32, 32).IsEmpty());
+
+  // CreateExact on various aspect ratios and sizes on the sample family.
+
+  // Targeting an image with width and/or height of 0 results in empty image.
+  EXPECT_TRUE(image_family_.CreateExact(0, 0).IsEmpty());
+  EXPECT_TRUE(image_family_.CreateExact(0, 64).IsEmpty());
+  EXPECT_TRUE(image_family_.CreateExact(64, 0).IsEmpty());
+
+  // Thinner than thinnest image.
+  EXPECT_IMAGE_SIZE(image_family_.CreateExact(2, 12), 2, 12);
+
+  // Exact match aspect ratio.
+  // Exact match size.
+  EXPECT_IMAGE_SIZE(image_family_.CreateExact(32, 32), 32, 32);
+  // Much smaller.
+  EXPECT_IMAGE_SIZE(image_family_.CreateExact(17, 17), 17, 17);
+  // Smaller than any image.
+  EXPECT_IMAGE_SIZE(image_family_.CreateExact(3, 3), 3, 3);
+  // Larger than any image.
+  EXPECT_IMAGE_SIZE(image_family_.CreateExact(512, 512), 512, 512);
+
+  // Wider than widest image.
+  EXPECT_IMAGE_SIZE(image_family_.CreateExact(255, 51), 255, 51);
+
+  // CreateExact on an image family with a non-N32 color bitmap results in an
+  // empty image.
+  gfx::ImageFamily a8_family;
+  SkBitmap a8_bitmap;
+  SkImageInfo a8_info = SkImageInfo::MakeA8(64, 64);
+  a8_bitmap.allocPixels(a8_info);
+  a8_family.Add(gfx::Image::CreateFrom1xBitmap(a8_bitmap));
+  EXPECT_TRUE(a8_family.CreateExact(32, 32).IsEmpty());
+}
+
 // Test adding and looking up images with 0 width and height.
 TEST_F(ImageFamilyTest, ZeroWidthAndHeight) {
   // An empty Image. Should be considered to have 0 width and height.
diff --git a/ui/gfx/vector_icons/business.icon b/ui/gfx/vector_icons/business.icon
new file mode 100644
index 0000000..bfefb7b4
--- /dev/null
+++ b/ui/gfx/vector_icons/business.icon
@@ -0,0 +1,87 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+MOVE_TO, 24, 14,
+V_LINE_TO, 6,
+H_LINE_TO, 4,
+R_V_LINE_TO, 36,
+R_H_LINE_TO, 40,
+V_LINE_TO, 14,
+H_LINE_TO, 24,
+CLOSE,
+MOVE_TO, 12, 38,
+H_LINE_TO, 8,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 0, -8,
+H_LINE_TO, 8,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 0, -8,
+H_LINE_TO, 8,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 0, -8,
+H_LINE_TO, 8,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 8, 24,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 0, -8,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 0, -8,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 0, -8,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, 4,
+CLOSE,
+R_MOVE_TO, 20, 24,
+H_LINE_TO, 24,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, -4,
+R_H_LINE_TO, 16,
+R_V_LINE_TO, 20,
+CLOSE,
+R_MOVE_TO, -4, -16,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, 4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, -4,
+CLOSE,
+R_MOVE_TO, 0, 8,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, 4,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, -4,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/credit_card.1x.icon b/ui/gfx/vector_icons/credit_card.1x.icon
new file mode 100644
index 0000000..2608251
--- /dev/null
+++ b/ui/gfx/vector_icons/credit_card.1x.icon
@@ -0,0 +1,28 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 13, 7,
+V_LINE_TO, 5,
+H_LINE_TO, 3,
+R_V_LINE_TO, 2,
+R_H_LINE_TO, 10,
+CLOSE,
+R_MOVE_TO, 0, 2,
+R_V_LINE_TO, 3,
+H_LINE_TO, 3,
+V_LINE_TO, 9,
+R_H_LINE_TO, 10,
+CLOSE,
+MOVE_TO, 1, 4.99f,
+CUBIC_TO, 1, 3.89f, 1.9f, 3, 3.01f, 3,
+R_H_LINE_TO, 9.99f,
+CUBIC_TO, 14.1f, 3, 15, 3.9f, 15, 4.99f,
+R_V_LINE_TO, 7.02f,
+R_CUBIC_TO, 0, 1.1f, -0.9f, 1.99f, -2.01f, 1.99f,
+H_LINE_TO, 3.01f,
+CUBIC_TO, 1.9f, 14, 1, 13.1f, 1, 12.01f,
+V_LINE_TO, 4.99f,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/credit_card.icon b/ui/gfx/vector_icons/credit_card.icon
new file mode 100644
index 0000000..c48afc5
--- /dev/null
+++ b/ui/gfx/vector_icons/credit_card.icon
@@ -0,0 +1,28 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 27, 5,
+H_LINE_TO, 5,
+CUBIC_TO, 3.25f, 5, 2.01f, 6.22f, 2, 8,
+R_V_LINE_TO, 16,
+R_CUBIC_TO, 0, 1.78f, 1.25f, 3, 3, 3,
+R_H_LINE_TO, 22,
+R_CUBIC_TO, 1.75f, 0, 3, -1.22f, 3, -3,
+V_LINE_TO, 8,
+R_CUBIC_TO, 0, -1.78f, -1.25f, -3, -3, -3,
+CLOSE,
+R_MOVE_TO, 0, 19,
+H_LINE_TO, 5,
+R_V_LINE_TO, -8,
+R_H_LINE_TO, 22,
+R_V_LINE_TO, 8,
+CLOSE,
+R_MOVE_TO, 0, -13,
+H_LINE_TO, 5,
+V_LINE_TO, 8,
+R_H_LINE_TO, 22,
+R_V_LINE_TO, 3,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/location_bar_http.1x.icon b/ui/gfx/vector_icons/location_bar_http.1x.icon
new file mode 100644
index 0000000..a1fc32d
--- /dev/null
+++ b/ui/gfx/vector_icons/location_bar_http.1x.icon
@@ -0,0 +1,23 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 4, 2,
+LINE_TO, 4, 13,
+LINE_TO, 12, 13,
+LINE_TO, 12, 5,
+LINE_TO, 9, 2,
+CLOSE,
+MOVE_TO, 9, 5,
+LINE_TO, 9, 3.25f,
+LINE_TO, 10.75f, 5,
+CLOSE,
+MOVE_TO, 5, 12,
+LINE_TO, 5, 3,
+LINE_TO, 8, 3,
+LINE_TO, 8, 6,
+LINE_TO, 11, 6,
+LINE_TO, 11, 12,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/location_bar_http.icon b/ui/gfx/vector_icons/location_bar_http.icon
new file mode 100644
index 0000000..da6fac4
--- /dev/null
+++ b/ui/gfx/vector_icons/location_bar_http.icon
@@ -0,0 +1,23 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 8, 5,
+LINE_TO, 8, 27,
+LINE_TO, 24, 27,
+LINE_TO, 24, 11,
+LINE_TO, 18, 5,
+CLOSE,
+MOVE_TO, 18, 11,
+LINE_TO, 18, 7.5f,
+LINE_TO, 21.5f, 11,
+CLOSE,
+MOVE_TO, 10, 25,
+LINE_TO, 10, 7,
+LINE_TO, 16, 7,
+LINE_TO, 16, 13,
+LINE_TO, 22, 13,
+LINE_TO, 22, 25,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/location_bar_https_invalid.1x.icon b/ui/gfx/vector_icons/location_bar_https_invalid.1x.icon
new file mode 100644
index 0000000..0edab3b
--- /dev/null
+++ b/ui/gfx/vector_icons/location_bar_https_invalid.1x.icon
@@ -0,0 +1,68 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+PATH_COLOR_ARGB, 0xFF, 0xC5, 0x39, 0x29,
+ROUND_RECT, 1, 1, 14, 14, 2,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 4, 7.99f,
+CUBIC_TO, 4, 7.44f, 4.45f, 7, 5, 7,
+LINE_TO, 11, 7,
+CUBIC_TO, 11.55f, 7, 12, 7.45f, 12, 7.99f,
+LINE_TO, 12, 12.01f,
+CUBIC_TO, 12, 12.56f, 11.55f, 13, 11, 13,
+LINE_TO, 5, 13,
+CUBIC_TO, 4.45f, 13, 4, 12.55f, 4, 12.01f,
+LINE_TO, 4, 7.99f,
+CLOSE,
+MOVE_TO, 7, 9,
+LINE_TO, 9, 9,
+LINE_TO, 9, 11,
+LINE_TO, 7, 11,
+CLOSE,
+MOVE_TO, 6, 8,
+LINE_TO, 7, 8,
+LINE_TO, 7, 9,
+LINE_TO, 6, 9,
+CLOSE,
+MOVE_TO, 9, 8,
+LINE_TO, 10, 8,
+LINE_TO, 10, 9,
+LINE_TO, 9, 9,
+CLOSE,
+MOVE_TO, 9, 11,
+LINE_TO, 10, 11,
+LINE_TO, 10, 12,
+LINE_TO, 9, 12,
+CLOSE,
+MOVE_TO, 6, 11,
+LINE_TO, 7, 11,
+LINE_TO, 7, 12,
+LINE_TO, 6, 12,
+CLOSE,
+MOVE_TO, 5, 4,
+LINE_TO, 6, 4,
+LINE_TO, 6, 7,
+LINE_TO, 5, 7,
+CLOSE,
+MOVE_TO, 10, 4,
+LINE_TO, 11, 4,
+LINE_TO, 11, 7,
+LINE_TO, 10, 7,
+CLOSE,
+MOVE_TO, 6, 3,
+LINE_TO, 10, 3,
+LINE_TO, 10, 4,
+LINE_TO, 6, 4,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0x66, 0xFF, 0xFF, 0xFF,
+ROUND_RECT, 5, 3, 1, 1, 0,
+ROUND_RECT, 10, 3, 1, 1, 0,
+NEW_PATH,
+PATH_COLOR_ARGB, 0x7F, 0xFF, 0xFF, 0xFF,
+ROUND_RECT, 9, 4, 1, 1, 0,
+ROUND_RECT, 6, 4, 1, 1, 0,
+END
diff --git a/ui/gfx/vector_icons/location_bar_https_invalid.icon b/ui/gfx/vector_icons/location_bar_https_invalid.icon
new file mode 100644
index 0000000..8ebeb31
--- /dev/null
+++ b/ui/gfx/vector_icons/location_bar_https_invalid.icon
@@ -0,0 +1,44 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+PATH_COLOR_ARGB, 0xFF, 0xC5, 0x39, 0x29,
+ROUND_RECT, 2, 2, 28, 28, 4,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 21, 25,
+LINE_TO, 11, 25,
+CUBIC_TO, 10, 25, 9, 24.01f, 9, 23.01f,
+LINE_TO, 9, 15.06f,
+CUBIC_TO, 9, 14.06f, 10, 12.97f, 11, 12.97f,
+LINE_TO, 11, 10.98f,
+CUBIC_TO, 11, 9.49f, 12.5f, 7, 16, 7,
+CUBIC_TO, 19.5f, 7, 21, 9.49f, 21, 10.98f,
+LINE_TO, 21, 12.97f,
+CUBIC_TO, 22, 12.97f, 23, 14.06f, 23, 15.06f,
+LINE_TO, 23, 23.01f,
+CUBIC_TO, 23, 24.01f, 22, 25, 21, 25,
+CLOSE,
+MOVE_TO, 13, 11.91f,
+LINE_TO, 13, 12.97f,
+LINE_TO, 19, 12.97f,
+CUBIC_TO, 19, 12.97f, 19, 11.95f, 19, 11.91f,
+CUBIC_TO, 18.96f, 10.21f, 17.68f, 8.99f, 16, 8.99f,
+CUBIC_TO, 14.29f, 8.99f, 13, 10.14f, 13, 11.91f,
+CLOSE,
+MOVE_TO, 18.05f, 15.95f,
+LINE_TO, 16.01f, 17.98f,
+LINE_TO, 13.97f, 15.95f,
+LINE_TO, 13.02f, 16.89f,
+LINE_TO, 15.07f, 18.92f,
+LINE_TO, 13, 20.98f,
+LINE_TO, 13.94f, 21.92f,
+LINE_TO, 16.01f, 19.86f,
+LINE_TO, 18.05f, 21.88f,
+LINE_TO, 19, 20.94f,
+LINE_TO, 16.96f, 18.92f,
+LINE_TO, 19, 16.89f,
+LINE_TO, 18.05f, 15.95f,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/location_bar_https_valid.1x.icon b/ui/gfx/vector_icons/location_bar_https_valid.1x.icon
new file mode 100644
index 0000000..71e61bdc
--- /dev/null
+++ b/ui/gfx/vector_icons/location_bar_https_valid.1x.icon
@@ -0,0 +1,47 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x80, 0x43,
+ROUND_RECT, 1, 1, 14, 14, 2,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 4, 7.99f,
+CUBIC_TO, 4, 7.44f, 4.45f, 7, 5, 7,
+LINE_TO, 11, 7,
+CUBIC_TO, 11.55f, 7, 12, 7.45f, 12, 7.99f,
+LINE_TO, 12, 12.01f,
+CUBIC_TO, 12, 12.56f, 11.55f, 13, 11, 13,
+LINE_TO, 5, 13,
+CUBIC_TO, 4.45f, 13, 4, 12.55f, 4, 12.01f,
+CLOSE,
+MOVE_TO, 7, 9,
+LINE_TO, 9, 9,
+LINE_TO, 9, 11,
+LINE_TO, 7, 11,
+CLOSE,
+MOVE_TO, 5, 4,
+LINE_TO, 6, 4,
+LINE_TO, 6, 7,
+LINE_TO, 5, 7,
+CLOSE,
+MOVE_TO, 10, 4,
+LINE_TO, 11, 4,
+LINE_TO, 11, 7,
+LINE_TO, 10, 7,
+CLOSE,
+MOVE_TO, 6, 3,
+LINE_TO, 10, 3,
+LINE_TO, 10, 4,
+LINE_TO, 6, 4,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0x66, 0xFF, 0xFF, 0xFF,
+ROUND_RECT, 5, 3, 1, 1, 0,
+ROUND_RECT, 10, 3, 1, 1, 0,
+NEW_PATH,
+PATH_COLOR_ARGB, 0x7F, 0xFF, 0xFF, 0xFF,
+ROUND_RECT, 9, 4, 1, 1, 0,
+ROUND_RECT, 6, 4, 1, 1, 0,
+END
diff --git a/ui/gfx/vector_icons/location_bar_https_valid.icon b/ui/gfx/vector_icons/location_bar_https_valid.icon
new file mode 100644
index 0000000..b33ab10a
--- /dev/null
+++ b/ui/gfx/vector_icons/location_bar_https_valid.icon
@@ -0,0 +1,39 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x80, 0x43,
+ROUND_RECT, 2, 2, 28, 28, 4,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 21, 25,
+LINE_TO, 11, 25,
+CUBIC_TO, 10, 25, 9, 24.01f, 9, 23.01f,
+LINE_TO, 9, 15.06f,
+CUBIC_TO, 9, 14.06f, 10, 12.97f, 11, 12.97f,
+LINE_TO, 11, 10.98f,
+CUBIC_TO, 11, 9.49f, 12.5f, 7, 16, 7,
+CUBIC_TO, 19.5f, 7, 21, 9.49f, 21, 10.98f,
+LINE_TO, 21, 12.97f,
+CUBIC_TO, 22, 12.97f, 23, 14.06f, 23, 15.06f,
+LINE_TO, 23, 23.01f,
+CUBIC_TO, 23, 24.01f, 22, 25, 21, 25,
+CLOSE,
+MOVE_TO, 16, 16.05f,
+CUBIC_TO, 14.9f, 16.05f, 14, 16.93f, 14, 18.01f,
+CUBIC_TO, 14, 18.73f, 14.4f, 19.35f, 15, 19.69f,
+LINE_TO, 15, 21.92f,
+LINE_TO, 17, 21.92f,
+LINE_TO, 17, 19.69f,
+CUBIC_TO, 17.6f, 19.35f, 18, 18.73f, 18, 18.01f,
+CUBIC_TO, 18, 16.93f, 17.1f, 16.05f, 16, 16.05f,
+CLOSE,
+MOVE_TO, 13, 11.91f,
+LINE_TO, 13, 12.97f,
+LINE_TO, 19, 12.97f,
+CUBIC_TO, 19, 12.97f, 19, 11.95f, 19, 11.91f,
+CUBIC_TO, 18.96f, 10.21f, 17.68f, 8.99f, 16, 8.99f,
+CUBIC_TO, 14.29f, 8.99f, 13, 10.14f, 13, 11.91f,
+CLOSE,
+END
diff --git a/ui/login/account_picker/user_pod_row.css b/ui/login/account_picker/user_pod_row.css
index 2472e1b3..412179398 100644
--- a/ui/login/account_picker/user_pod_row.css
+++ b/ui/login/account_picker/user_pod_row.css
@@ -748,6 +748,7 @@
 .expanded-pane-learn-more,
 .pod.public-account .learn-more {
   background-image: url(../../webui/resources/images/business.svg);
+  background-size: 18px;
   height: 18px;
   position: relative;
   width: 18px;
diff --git a/ui/message_center/message_center.h b/ui/message_center/message_center.h
index 8fcd7b7..3e285a34 100644
--- a/ui/message_center/message_center.h
+++ b/ui/message_center/message_center.h
@@ -13,6 +13,7 @@
 #include "ui/message_center/notification_list.h"
 
 class DownloadNotification;
+class DownloadNotificationTestBase;
 
 namespace base {
 class DictionaryValue;
@@ -181,6 +182,7 @@
 
  protected:
   friend class ::DownloadNotification;
+  friend class ::DownloadNotificationTestBase;
   friend class MessageCenterImplTest;
   friend class MessageCenterImplTestWithChangeQueue;
   friend class MessageCenterImplTestWithoutChangeQueue;
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
index 21495f66..0c92d4aa 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
@@ -4,6 +4,8 @@
 
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h"
 
+#include <errno.h>
+
 #include "base/bind.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
diff --git a/ui/ozone/public/input_controller.cc b/ui/ozone/public/input_controller.cc
index df9a7ba..5aa5beb 100644
--- a/ui/ozone/public/input_controller.cc
+++ b/ui/ozone/public/input_controller.cc
@@ -42,6 +42,8 @@
   void GetTouchEventLog(const base::FilePath& out_dir,
                         const GetTouchEventLogReply& reply) override;
   void SetInternalTouchpadEnabled(bool enabled) override;
+  bool IsInternalTouchpadEnabled() const override;
+  void SetTouchscreensEnabled(bool enabled) override;
   void SetInternalKeyboardFilter(bool enable_filter,
                                  std::vector<DomCode> allowed_keys) override;
 
@@ -134,6 +136,12 @@
 void StubInputController::SetInternalTouchpadEnabled(bool enabled) {
 }
 
+bool StubInputController::IsInternalTouchpadEnabled() const {
+  return false;
+}
+
+void StubInputController::SetTouchscreensEnabled(bool enabled) {}
+
 void StubInputController::SetInternalKeyboardFilter(
     bool enable_filter,
     std::vector<DomCode> allowed_keys) {
diff --git a/ui/ozone/public/input_controller.h b/ui/ozone/public/input_controller.h
index fbf5c060..e7fdaf7 100644
--- a/ui/ozone/public/input_controller.h
+++ b/ui/ozone/public/input_controller.h
@@ -77,6 +77,9 @@
   virtual void SetTapToClickPaused(bool state) = 0;
 
   virtual void SetInternalTouchpadEnabled(bool enabled) = 0;
+  virtual bool IsInternalTouchpadEnabled() const = 0;
+
+  virtual void SetTouchscreensEnabled(bool enabled) = 0;
 
   // If |enable_filter| is true, all keys on the internal keyboard except
   // |allowed_keys| are disabled.
diff --git a/ui/views/border.cc b/ui/views/border.cc
index 95628735..0458025 100644
--- a/ui/views/border.cc
+++ b/ui/views/border.cc
@@ -6,7 +6,9 @@
 
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
+#include "third_party/skia/include/core/SkPaint.h"
 #include "ui/gfx/canvas.h"
+#include "ui/gfx/geometry/rect_f.h"
 #include "ui/views/painter.h"
 #include "ui/views/view.h"
 
@@ -59,6 +61,50 @@
   return gfx::Size(insets_.width(), insets_.height());
 }
 
+// A border with a rounded rectangle and single color.
+class RoundedRectBorder : public Border {
+ public:
+  RoundedRectBorder(int thickness, int corner_radius, SkColor color);
+
+  // Overridden from Border:
+  void Paint(const View& view, gfx::Canvas* canvas) override;
+  gfx::Insets GetInsets() const override;
+  gfx::Size GetMinimumSize() const override;
+
+ private:
+  const int thickness_;
+  const int corner_radius_;
+  const SkColor color_;
+
+  DISALLOW_COPY_AND_ASSIGN(RoundedRectBorder);
+};
+
+RoundedRectBorder::RoundedRectBorder(int thickness,
+                                     int corner_radius,
+                                     SkColor color)
+    : thickness_(thickness), corner_radius_(corner_radius), color_(color) {}
+
+void RoundedRectBorder::Paint(const View& view, gfx::Canvas* canvas) {
+  SkPaint paint;
+  paint.setStrokeWidth(thickness_);
+  paint.setColor(color_);
+  paint.setStyle(SkPaint::kStroke_Style);
+  paint.setAntiAlias(true);
+
+  float half_thickness = thickness_ / 2;
+  gfx::RectF bounds(view.GetLocalBounds());
+  bounds.Inset(half_thickness, half_thickness);
+  canvas->DrawRoundRect(bounds, corner_radius_, paint);
+}
+
+gfx::Insets RoundedRectBorder::GetInsets() const {
+  return gfx::Insets(thickness_, thickness_, thickness_, thickness_);
+}
+
+gfx::Size RoundedRectBorder::GetMinimumSize() const {
+  return gfx::Size(thickness_ * 2, thickness_ * 2);
+}
+
 class EmptyBorder : public Border {
  public:
   explicit EmptyBorder(const gfx::Insets& insets);
@@ -147,6 +193,14 @@
 }
 
 // static
+scoped_ptr<Border> Border::CreateRoundedRectBorder(int thickness,
+                                                   int corner_radius,
+                                                   SkColor color) {
+  return make_scoped_ptr(
+      new RoundedRectBorder(thickness, corner_radius, color));
+}
+
+// static
 scoped_ptr<Border> Border::CreateEmptyBorder(int top,
                                              int left,
                                              int bottom,
diff --git a/ui/views/border.h b/ui/views/border.h
index e2f7be6..6bbcec70 100644
--- a/ui/views/border.h
+++ b/ui/views/border.h
@@ -49,6 +49,12 @@
   // color.
   static scoped_ptr<Border> CreateSolidBorder(int thickness, SkColor color);
 
+  // Creates a border that is a rounded rectangle of the specified thickness and
+  // color.
+  static scoped_ptr<Border> CreateRoundedRectBorder(int thickness,
+                                                    int corner_radius,
+                                                    SkColor color);
+
   // Creates a border for reserving space. The returned border does not
   // paint anything.
   static scoped_ptr<Border> CreateEmptyBorder(const gfx::Insets& insets);
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index 035df76..67b939c 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -14,13 +14,13 @@
 #include "base/trace_event/trace_event.h"
 #include "base/win/scoped_gdi_object.h"
 #include "base/win/windows_version.h"
-#include "ui/base/touch/touch_enabled.h"
 #include "ui/base/view_prop.h"
 #include "ui/base/win/internal_constants.h"
 #include "ui/base/win/lock_state.h"
 #include "ui/base/win/mouse_wheel_util.h"
 #include "ui/base/win/shell.h"
 #include "ui/base/win/touch_input.h"
+#include "ui/events/base_event_utils.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/keyboard_code_conversion_win.h"