diff --git a/.gitignore b/.gitignore
index ef33bc3..88cf776 100644
--- a/.gitignore
+++ b/.gitignore
@@ -335,7 +335,7 @@
 /third_party/khronos_glcts
 /third_party/leveldatabase/src
 /third_party/leveldb
-/third_party/libc++-static/libc++-static.a
+/third_party/libc++-static/libc++.a
 /third_party/libaddressinput/src
 /third_party/libexif/sources
 /third_party/libjingle/source
diff --git a/DEPS b/DEPS
index b74c15f..293977e 100644
--- a/DEPS
+++ b/DEPS
@@ -43,7 +43,7 @@
   # 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': 'd8763f7b00ac527534f5182b1028aa7f0868bf5d',
+  'v8_revision': '3e0e1f19d153dd0408e50d7ad9ce44fd43d3f812',
   # 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.
@@ -59,7 +59,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '9ddafc82bddb984ae46ee0df801ba20b446d5158',
+  'pdfium_revision': '9b2741829b8a8c511ef0f2f313ff53d77ac96307',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -682,7 +682,7 @@
                 '--platform=darwin',
                 '--no_auth',
                 '--bucket', 'chromium-libcpp',
-                '-s', 'src/third_party/libc++-static/libc++-static.a.sha1',
+                '-s', 'src/third_party/libc++-static/libc++.a.sha1',
     ],
   },
   # Pull luci-go binaries (isolate, swarming) using checked-in hashes.
diff --git a/base/trace_event/memory_allocator_dump.cc b/base/trace_event/memory_allocator_dump.cc
index 76d53eb..703fc65b 100644
--- a/base/trace_event/memory_allocator_dump.cc
+++ b/base/trace_event/memory_allocator_dump.cc
@@ -35,10 +35,6 @@
   // The |absolute_name| can contain slash separator, but not leading or
   // trailing ones.
   DCHECK(absolute_name[0] != '/' && *absolute_name.rbegin() != '/');
-
-  // Dots are not allowed anywhere as the underlying base::DictionaryValue
-  // would treat them magically and split in sub-nodes, which is not intended.
-  DCHECK_EQ(std::string::npos, absolute_name.find_first_of('.'));
 }
 
 // If the caller didn't provide a guid, make one up by hashing the
diff --git a/build/common.gypi b/build/common.gypi
index e7b0527..56dc197 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -5260,6 +5260,16 @@
           },  # configuration "Release"
         },  # configurations
         'xcode_settings': {
+          # Everything should include libc++ headers. Just passing
+          # -stdlib=libc++ doesn't just work in NaCl targets with asan enabled
+          # until http://crbug.com/544325 is fixed, so tell the compiler to not
+          # add any include paths, and instead below add the c++ include
+          # directory as include_dirs.  Then we can not set CLANG_CXX_LIBRARY
+          # to libc++ for NaCl targets and that way they'll link against
+          # libstdc++ on the ASan bots (ASan requires a C++ library to be linked
+          # even for the C-only NaCl programs).
+          'OTHER_CPLUSPLUSFLAGS': [ '$inherited', '-nostdinc++', ],
+
           'GCC_DYNAMIC_NO_PIC': 'NO',               # No -mdynamic-no-pic
                                                     # (Equivalent to -fPIC)
           # MACOSX_DEPLOYMENT_TARGET maps to -mmacosx-version-min
@@ -5277,22 +5287,53 @@
             '-fno-strict-aliasing',  # See http://crbug.com/32204.
           ],
           'conditions': [
-            ['component=="shared_library"', {
-              # In component builds, link to the system libc++. This requires
-              # OS X 10.7, but we currently pass -mmacosx-version-min=10.6.
-              # Xcode's clang complains about this, but our open-source bundled
-              # chromium clang doesn't.  This has the effect of making
-              # everything depend on libc++, which means component-build
-              # binaries won't run on 10.6 (no libc++ there), but for a
-              # developer-only configuration that's ok.
-              # (We don't want to raise the deployment target yet so that
-              # official and dev builds have the same deployment target.  This
-              # affects things like which functions are considered deprecated.)
+            # TODO(thakis): Remove this condition once http://crbug.com/544325
+            # is fixed. Some targets below native_client still link use the
+            # 10.6 SDK which doesn't contain a libc++.
+            ['mac_sdk!="10.6"', {
+              # Tell the compiler to use libc++'s headers and the linker to link
+              # against libc++.  The latter part normally requires OS X 10.7,
+              # but we still support running on 10.6.  How does this work?  Two
+              # parts:
+              # 1. Chromium's clang doesn't error on -mmacosx-version-min=10.6
+              #    combined with -stdlib=libc++ (it normally silently produced a
+              #    binary that doesn't run on 10.6)
+              # 2. Further down, library_dirs is set to
+              #    third_party/libc++-static, which contains a static
+              #    libc++.a library.  The linker then links against that instead
+              #    of against /usr/lib/libc++.dylib when it sees the -lc++ flag
+              #    added by the driver.
+              #
+              # In component builds, just link to the system libc++.  This has
+              # the effect of making everything depend on libc++, which means
+              # component-build binaries won't run on 10.6 (no libc++ there),
+              # but for a developer-only configuration that's ok.  (We don't
+              # want to raise the deployment target yet so that official and
+              # dev builds have the same deployment target.  This affects
+              # things like which functions are considered deprecated.)
               'CLANG_CXX_LIBRARY': 'libc++',  # -stdlib=libc++
+
             }],
           ],
         },
         'target_conditions': [
+          ['>(nacl_untrusted_build)==0', {
+            'include_dirs': [
+              '<(DEPTH)/third_party/llvm-build/Release+Asserts/include/c++/v1',
+            ],
+          }],
+          ['>(nacl_untrusted_build)==0 and component=="static_library"', {
+            # See the comment for CLANG_CXX_LIBRARY above for what this does.
+            # The NaCl toolchains have their own toolchain and don't need this.
+            # ASan requires 10.7+ and clang implicitly adds -lc++abi in ASan
+            # mode.  Our libc++.a contains both libc++ and libc++abi in one
+            # library, so it doesn't work in that mode.
+            'conditions': [
+              ['asan==0', {
+                'library_dirs': [ '<(DEPTH)/third_party/libc++-static' ],
+              }],
+            ],
+          }],
           ['_type=="executable"', {
             'postbuilds': [
               {
diff --git a/chrome/VERSION b/chrome/VERSION
index 9dde8a4..54d6f7f8 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=48
 MINOR=0
-BUILD=2545
+BUILD=2546
 PATCH=0
diff --git a/chrome/app/theme/default_100_percent/common/omnibox_extension_app_dark.png b/chrome/app/theme/default_100_percent/common/omnibox_extension_app_dark.png
deleted file mode 100644
index d5807d9..0000000
--- a/chrome/app/theme/default_100_percent/common/omnibox_extension_app_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/omnibox_http_dark.png b/chrome/app/theme/default_100_percent/common/omnibox_http_dark.png
deleted file mode 100644
index 5b8ef96..0000000
--- a/chrome/app/theme/default_100_percent/common/omnibox_http_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/omnibox_search_dark.png b/chrome/app/theme/default_100_percent/common/omnibox_search_dark.png
deleted file mode 100644
index f2d29b70..0000000
--- a/chrome/app/theme/default_100_percent/common/omnibox_search_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/omnibox_star_dark.png b/chrome/app/theme/default_100_percent/common/omnibox_star_dark.png
deleted file mode 100644
index 3a89bc2..0000000
--- a/chrome/app/theme/default_100_percent/common/omnibox_star_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/omnibox_tts_dark.png b/chrome/app/theme/default_100_percent/common/omnibox_tts_dark.png
deleted file mode 100644
index 2c574f76..0000000
--- a/chrome/app/theme/default_100_percent/common/omnibox_tts_dark.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index f273452..55d48ae 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -510,12 +510,10 @@
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EV_BUBBLE_TOP" file="common/omnibox_ev_bubble_top.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EV_BUBBLE_TOP_LEFT" file="common/omnibox_ev_bubble_top_left.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EV_BUBBLE_TOP_RIGHT" file="common/omnibox_ev_bubble_top_right.png" />
-      <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EXTENSION_APP_DARK" file="common/omnibox_extension_app_dark.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_EXTENSION_APP_SELECTED" file="common/omnibox_extension_app_selected.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_INVALID" file="common/omnibox_https_invalid.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_POLICY_WARNING" file="common/controlled_setting_mandatory.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTPS_VALID" file="common/omnibox_https_valid.png" />
-      <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTP_DARK" file="common/omnibox_http_dark.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_HTTP_SELECTED" file="common/omnibox_http_selected.png" />
       <if expr="is_macosx or is_ios">
         <structure type="chrome_scaled_image" name="IDR_OMNIBOX_KEYWORD_HINT_TAB" file="mac/omnibox_keyword_hint_tab.png" />
@@ -535,7 +533,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_DARK" file="common/omnibox_search_dark.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" />
       <if expr="enable_topchrome_md">
@@ -552,10 +549,8 @@
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_TOP_LEFT" file="common/omnibox_selected_keyword_bubble_top_left.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_SELECTED_KEYWORD_BUBBLE_TOP_RIGHT" file="common/omnibox_selected_keyword_bubble_top_right.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_STAR" file="common/omnibox_star.png" />
-      <structure type="chrome_scaled_image" name="IDR_OMNIBOX_STAR_DARK" file="common/omnibox_star_dark.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_STAR_SELECTED" file="common/omnibox_star_selected.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS" file="common/omnibox_tts.png" />
-      <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS_DARK" file="common/omnibox_tts_dark.png" />
       <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS_SELECTED" file="common/omnibox_tts_selected.png" />
       <if expr="toolkit_views and not is_macosx">
         <!-- In Material Design the Ash image is the same as the common one, so
diff --git a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
index 67bedea..b50ba964 100644
--- a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
@@ -268,7 +268,7 @@
   CheckGaiaKeyboard();
 
   // Switch back.
-  js_checker().Evaluate("$('cancel-add-user-button').click()");
+  js_checker().Evaluate("$('gaia-signin').cancel()");
   OobeScreenWaiter(OobeDisplay::SCREEN_ACCOUNT_PICKER).Wait();
 
   EXPECT_EQ(expected_input_methods,
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_creation_browsertest.cc b/chrome/browser/chromeos/login/supervised/supervised_user_creation_browsertest.cc
index d9e8394..0c58cad 100644
--- a/chrome/browser/chromeos/login/supervised/supervised_user_creation_browsertest.cc
+++ b/chrome/browser/chromeos/login/supervised/supervised_user_creation_browsertest.cc
@@ -180,7 +180,7 @@
   ASSERT_EQ(3UL, user_manager::UserManager::Get()->GetUsers().size());
 
   // We wait for token now. Press cancel button at this point.
-  JSEvalOrExitBrowser("$('cancel-add-user-button').click()");
+  JSEvalOrExitBrowser("$('supervised-user-creation').cancel()");
 }
 
 IN_PROC_BROWSER_TEST_(
diff --git a/chrome/browser/resources/chromeos/login/header_bar.html b/chrome/browser/resources/chromeos/login/header_bar.html
index 1358dec..c6cd2fd 100644
--- a/chrome/browser/resources/chromeos/login/header_bar.html
+++ b/chrome/browser/resources/chromeos/login/header_bar.html
@@ -18,8 +18,6 @@
   <div id="add-user-header-bar-item" class="header-bar-item" hidden>
     <button id="add-user-button" class="custom-appearance"
         i18n-content="addUser"></button>
-    <button id="cancel-add-user-button" class="custom-appearance"
-        i18n-content="cancel" hidden></button>
   </div>
   <div id="more-settings-header-bar-item" class="header-bar-item">
     <button id="more-settings-button" class="custom-appearance"
diff --git a/chrome/browser/resources/chromeos/login/header_bar.js b/chrome/browser/resources/chromeos/login/header_bar.js
index 5a747c8..723fa68 100644
--- a/chrome/browser/resources/chromeos/login/header_bar.js
+++ b/chrome/browser/resources/chromeos/login/header_bar.js
@@ -54,8 +54,6 @@
           this.handleAddUserClick_);
       $('more-settings-button').addEventListener('click',
           this.handleMoreSettingsClick_.bind(this));
-      $('cancel-add-user-button').addEventListener('click',
-          this.handleCancelAddUserClick_);
       $('guest-user-header-bar-item').addEventListener('click',
           this.handleGuestClick_);
       $('guest-user-button').addEventListener('click',
@@ -275,20 +273,6 @@
     },
 
     /**
-     * Whether the Cancel button is enabled during Gaia sign-in.
-     *
-     * @type {boolean}
-     */
-    set allowCancel(value) {
-      this.allowCancel_ = value;
-      this.updateUI_();
-    },
-
-    get allowCancel() {
-      return !!this.allowCancel_;
-    },
-
-    /**
      * Update whether there are kiosk apps.
      *
      * @type {boolean}
@@ -342,16 +326,6 @@
           isLockScreen ||
           errorScreenIsActive ||
           supervisedUserCreationDialogIsActive;
-      $('cancel-add-user-button').hidden =
-          !this.allowCancel_ ||
-          gaiaIsActive ||
-          isPasswordChangedUI ||
-          isSamlPasswordConfirm ||
-          errorScreenIsActive ||
-          accountPickerIsActive ||
-          wrongHWIDWarningIsActive ||
-          isMultiProfilesUI ||
-          supervisedUserCreationDialogIsActive;
       $('guest-user-header-bar-item').hidden =
           !this.showGuest_ ||
           isLockScreen ||
@@ -359,15 +333,14 @@
           wrongHWIDWarningIsActive ||
           isSamlPasswordConfirm ||
           isMultiProfilesUI ||
-          (this.allowCancel_ && gaiaIsActive) ||
+          (gaiaIsActive && $('gaia-signin').cancelable) ||
           enrollmentIsActiveWithBackButton ||
           gaiaIsActiveWithBackButton;
       $('restart-header-bar-item').hidden = !this.showReboot_;
       $('shutdown-header-bar-item').hidden = !this.showShutdown_;
       $('sign-out-user-item').hidden = !isLockScreen;
 
-      $('add-user-header-bar-item').hidden =
-          $('add-user-button').hidden && $('cancel-add-user-button').hidden;
+      $('add-user-header-bar-item').hidden = $('add-user-button').hidden;
       $('apps-header-bar-item').hidden = !this.hasApps_ ||
           (!gaiaIsActive && !accountPickerIsActive);
       $('cancel-multiple-sign-in-item').hidden = !isMultiProfilesUI;
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.js b/chrome/browser/resources/chromeos/login/screen_error_message.js
index 954c915..fffdc6e8 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.js
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.js
@@ -89,6 +89,16 @@
     // Error screen initial error state.
     error_state_: ERROR_STATE.UNKNOWN,
 
+    // Whether the screen can be cancelled.
+    cancelable_: false,
+    get cancelable() {
+      return this.cancelable_;
+    },
+    set cancelable(value) {
+      this.cancelable_ = value;
+      $('error-close-button').hidden = !value;
+    },
+
     /** @override */
     decorate: function() {
       cr.ui.DropDown.decorate($('offline-networks-list'));
@@ -222,7 +232,7 @@
       cr.ui.Oobe.clearErrors();
       cr.ui.DropDown.show('offline-networks-list', false);
       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ERROR;
-      $('error-close-button').hidden = !$('login-header-bar').allowCancel;
+      this.cancelable = $('pod-row').pods.length;
     },
 
     /**
@@ -423,7 +433,7 @@
      * Cancels error screen and drops to user pods.
      */
     cancel: function() {
-      if ($('login-header-bar').allowCancel)
+      if (this.cancelable)
         Oobe.showUserPods();
     }
   };
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index a4d79776..7086ff3 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -100,7 +100,15 @@
      * @type {boolean}
      * @private
      */
-    cancelAllowed_: undefined,
+    cancelable_: false,
+    get cancelable() {
+      // TODO(dzhioev): add cancel and refresh buttons hiding logic here.
+      // http://crbug.com/484514
+      return this.cancelable_;
+    },
+    set cancelable(value) {
+      this.cancelable_ = value;
+    },
 
     /**
      * Whether we should show user pods on the login screen.
@@ -515,10 +523,9 @@
      * user pods can be displayed.
      */
     updateCancelButtonState: function() {
-      this.cancelAllowed_ = this.isLocal ||
-                            (this.isShowUsers_ && $('pod-row').pods.length);
-      $('login-header-bar').allowCancel = this.cancelAllowed_;
-      $('close-button-item').hidden = !this.cancelAllowed_;
+      this.cancelable = this.isLocal ||
+                        (this.isShowUsers_ && $('pod-row').pods.length);
+      $('close-button-item').hidden = !this.cancelable;
     },
 
     /**
@@ -550,8 +557,7 @@
 
       if (Oobe.getInstance().currentScreen === this) {
         Oobe.getInstance().updateScreenSize(this);
-        $('login-header-bar').allowCancel = isSAML || this.cancelAllowed_;
-        $('close-button-item').hidden = !(isSAML || this.cancelAllowed_);
+        $('close-button-item').hidden = !(isSAML || this.cancelable);
       }
     },
 
@@ -828,7 +834,6 @@
     showErrorBubble: function(loginAttempts, error) {
       if (this.isLocal) {
         $('add-user-button').hidden = true;
-        $('cancel-add-user-button').hidden = false;
         // Reload offline version of the sign-in extension, which will show
         // error itself.
         chrome.send('offlineLogin', [this.email]);
@@ -847,7 +852,7 @@
      * Called when user canceled signin.
      */
     cancel: function() {
-      if (!this.cancelAllowed_) {
+      if (!this.cancelable) {
         // In OOBE signin screen, cancel is not allowed because there is
         // no other screen to show. If user is in middle of a saml flow,
         // reset signin screen to get out of the saml flow.
diff --git a/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.html b/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.html
index bfa6ee72..c9fddb52 100644
--- a/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.html
+++ b/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.html
@@ -16,6 +16,7 @@
             i18n-content="createSupervisedUserIntroText3"></div>
       </div>
     </div>
+
     <div id="supervised-user-creation-manager" class="page-no-marketing" hidden>
       <div id="supervised-user-creation-managers-block" hidden>
         <div class="logo-padded-text">
@@ -28,6 +29,7 @@
         <div id="supervised-user-creation-managers-pane"></div>
       </div>
     </div>
+
     <div id="supervised-user-creation-username" class="page-no-marketing"
         role="group"
         i18n-values="aria-label:createSupervisedUserNameAccessibleTitle" hidden>
@@ -114,6 +116,7 @@
         </div>
       </div>
     </div>
+
     <div id="supervised-user-creation-error" hidden>
       <img alt class="error-icon" src="chrome://theme/IDR_TECHNICAL_ERROR">
       <div id="supervised-user-creation-error-title" class="error-title"></div>
diff --git a/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.js b/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.js
index cc0bc952..63183d3e5 100644
--- a/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.js
+++ b/chrome/browser/resources/chromeos/login/screen_supervised_user_creation.js
@@ -1100,8 +1100,8 @@
                        'manager',
                        'username',
                        'import',
-                       'error',
-                       'created'];
+                       'created',
+                       'error'];
       var pageButtons = {'intro' : 'start',
                          'error' : 'error',
                          'import' : 'import',
@@ -1126,12 +1126,6 @@
         button.disabled = false;
       }
 
-      var pagesWithCancel = ['intro', 'manager', 'username', 'import-password',
-          'error', 'import'];
-      $('login-header-bar').allowCancel =
-          pagesWithCancel.indexOf(visiblePage) > -1;
-      $('cancel-add-user-button').disabled = false;
-
       this.getScreenElement('import-link').hidden = true;
       this.getScreenElement('create-link').hidden = true;
 
@@ -1329,7 +1323,6 @@
         control.disabled = value;
       }
       $('login-header-bar').disabled = value;
-      $('cancel-add-user-button').disabled = false;
     },
 
     /**
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 c58f4f4..05b06301 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
@@ -52,7 +52,7 @@
     <route-details id="route-details" route="[[currentRoute_]]"
         sink="[[computeSinkForCurrentRoute_(currentRoute_)]]"
         on-back-click="showSinkList_"
-        on-close-route-click="showSinkList_"
+        on-close-route-click="onCloseRouteClick_"
         hidden$="[[computeRouteDetailsHidden_(currentView_, issue)]]">
     </route-details>
     <div id="sink-list-view"
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 ba949c3..21dad30 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
@@ -194,11 +194,24 @@
       type: Array,
       value: [],
     },
+
+    /**
+     * List of active timer IDs. Used to retrieve active timer IDs when
+     * clearing timers.
+     * @private {!Array<number>}
+     */
+    timerIdList_: {
+      type: Array,
+      value: [],
+    },
+  },
+
+  listeners: {
+    'tap': 'onTap_',
   },
 
   ready: function() {
     this.addEventListener('arrow-drop-click', this.toggleCastModeHidden_);
-    this.addEventListener('close-route-click', this.removeRoute);
     this.showSinkList_();
   },
 
@@ -536,6 +549,18 @@
   },
 
   /**
+   * Handles a close-route-click event. Shows the sink list and starts a timer
+   * to close the dialog if there is no click within three seconds.
+   *
+   * @param {!Event} event The event object.
+   * @private
+   */
+  onCloseRouteClick_: function(event) {
+    this.showSinkList_();
+    this.startTapTimer_();
+  },
+
+  /**
    * Handles response of previous create route attempt.
    *
    * @param {string} sinkId The ID of the sink to which the Media Route was
@@ -549,9 +574,8 @@
     if (!route)
       return;
 
-    // Check if |route| already exists or if its associated sink
-    // does not exist.
-    if (this.routeMap_[route.id] || !this.sinkMap_[route.sinkId])
+    // Check that |sinkId| exists.
+    if (!this.sinkMap_[sinkId])
       return;
 
     // If there is an existing route associated with the same sink, its
@@ -559,6 +583,8 @@
     // which results in the correct sink to route mapping.
     this.routeList.push(route);
     this.showRouteDetails_(route);
+
+    this.startTapTimer_();
   },
 
   onNotifyRouteCreationTimeout: function() {
@@ -576,6 +602,24 @@
   },
 
   /**
+   * Called when a tap event is triggered. Clears any active timers. onTap_
+   * is called before a new timer is started for taps that trigger a new active
+   * timer.
+   *
+   * @private
+   */
+  onTap_: function(e) {
+    if (this.timerIdList_.length == 0)
+      return;
+
+    this.timerIdList_.forEach(function(id) {
+      clearTimeout(id);
+    }, this);
+
+    this.timerIdList_ = [];
+  },
+
+  /**
    * Called when |routeList| is updated. Rebuilds |routeMap_| and
    * |sinkToRouteMap_|.
    *
@@ -720,6 +764,20 @@
   },
 
   /**
+   * Starts a timer which fires a close-dialog event if the timer has not been
+   * cleared within three seconds.
+   *
+   * @private
+   */
+  startTapTimer_: function() {
+    var id = setTimeout(function() {
+      this.fire('close-dialog');
+    }.bind(this), 3000 /* 3 seconds */);
+
+    this.timerIdList_.push(id);
+  },
+
+  /**
    * Toggles |currentView_| between CAST_MODE_LIST and SINK_LIST.
    *
    * @private
diff --git a/chrome/browser/resources/media_router/media_router.js b/chrome/browser/resources/media_router/media_router.js
index 4773a16..1123de1 100644
--- a/chrome/browser/resources/media_router/media_router.js
+++ b/chrome/browser/resources/media_router/media_router.js
@@ -22,7 +22,8 @@
     container = $('media-router-container');
     media_router.ui.setContainer(container);
 
-    container.addEventListener('close-button-click', onCloseDialogClick);
+    container.addEventListener('close-button-click', onCloseDialogEvent);
+    container.addEventListener('close-dialog', onCloseDialogEvent);
     container.addEventListener('close-route-click', onCloseRouteClick);
     container.addEventListener('create-route', onCreateRoute);
     container.addEventListener('issue-action-click', onIssueActionClick);
@@ -32,7 +33,7 @@
    * Closes the dialog.
    * Called when the user clicks the close button on the dialog.
    */
-  function onCloseDialogClick() {
+  function onCloseDialogEvent() {
     media_router.browserApi.closeDialog();
   }
 
diff --git a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
index ec56d95d..8426061 100644
--- a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
+++ b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
@@ -1205,17 +1205,6 @@
     case IDR_OMNIBOX_TTS: {
       return GenerateTintedIcon(id, entry_tint_);
     }
-    // In GTK mode, the dark versions of the omnibox icons only ever appear in
-    // the autocomplete popup and only against the current theme's GtkEntry
-    // base[GTK_STATE_SELECTED] color, so tint the icons so they won't collide
-    // with the selected color.
-    case IDR_OMNIBOX_EXTENSION_APP_DARK:
-    case IDR_OMNIBOX_HTTP_DARK:
-    case IDR_OMNIBOX_SEARCH_DARK:
-    case IDR_OMNIBOX_STAR_DARK:
-    case IDR_OMNIBOX_TTS_DARK: {
-      return GenerateTintedIcon(id, selected_entry_tint_);
-    }
 
     // TODO(erg): The dropdown arrow should be tinted because we're injecting
     // various background GTK colors, but the code that accesses them needs to
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index b80be994c..47f0628 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -886,13 +886,16 @@
     return;
   }
 
+  // Send the updated user list to the UI.
+  if (delegate_)
+    delegate_->HandleGetUsers();
+
   if (delegate_ && !delegate_->IsShowUsers()) {
     HandleShowAddUser(nullptr);
   } else {
-    if (delegate_)
-      delegate_->HandleGetUsers();
     UpdateUIState(UI_STATE_ACCOUNT_PICKER, nullptr);
   }
+
   preferences_changed_delayed_ = false;
 }
 
diff --git a/chrome/chrome_dll.gypi b/chrome/chrome_dll.gypi
index ef61887..b0422e4 100644
--- a/chrome/chrome_dll.gypi
+++ b/chrome/chrome_dll.gypi
@@ -304,7 +304,7 @@
               ],
             }],
             # This step currently fails when using LTO. TODO(pcc): Re-enable.
-            ['OS=="mac" and use_lto==0', {
+            ['OS=="mac" and use_lto==0 and component=="static_library" and asan==0', {
               'postbuilds': [
                 {
                   # This step causes an error to be raised if the .order file
diff --git a/chrome/test/media_router/media_router_integration_browsertest.cc b/chrome/test/media_router/media_router_integration_browsertest.cc
index 3bda7121..91066cea 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.cc
+++ b/chrome/test/media_router/media_router_integration_browsertest.cc
@@ -55,7 +55,8 @@
 const char kGetRouteLengthScript[] =
     "domAutomationController.send(window.document.getElementById("
     "  'media-router-container').routeList.length)";
-
+const char kClickDialog[] =
+    "window.document.getElementById('media-router-container').click();";
 std::string GetStartedSessionId(content::WebContents* web_contents) {
   std::string session_id;
   CHECK(content::ExecuteScriptAndExtractString(
@@ -143,6 +144,12 @@
   ASSERT_TRUE(content::ExecuteScript(dialog_contents, script));
 }
 
+void MediaRouterIntegrationBrowserTest::ClickDialog() {
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::WebContents* dialog_contents = GetMRDialog(web_contents);
+  ASSERT_TRUE(content::ExecuteScript(dialog_contents, kClickDialog));
+}
 content::WebContents* MediaRouterIntegrationBrowserTest::GetMRDialog(
     content::WebContents* web_contents) {
   MediaRouterDialogControllerImpl* controller =
@@ -152,6 +159,29 @@
   return dialog_contents;
 }
 
+bool MediaRouterIntegrationBrowserTest::IsDialogClosed(
+    content::WebContents* web_contents) {
+  MediaRouterDialogControllerImpl* controller =
+      MediaRouterDialogControllerImpl::GetOrCreateForWebContents(web_contents);
+  return !controller->GetMediaRouterDialog();
+}
+
+void MediaRouterIntegrationBrowserTest::WaitUntilDialogClosed(
+    content::WebContents* web_contents) {
+  ASSERT_TRUE(ConditionalWait(
+      base::TimeDelta::FromSeconds(5), base::TimeDelta::FromSeconds(1),
+      base::Bind(&MediaRouterIntegrationBrowserTest::IsDialogClosed,
+                 base::Unretained(this), web_contents)));
+}
+
+void MediaRouterIntegrationBrowserTest::CheckDialogRemainsOpen(
+    content::WebContents* web_contents) {
+  ASSERT_FALSE(ConditionalWait(
+      base::TimeDelta::FromSeconds(5), base::TimeDelta::FromSeconds(1),
+      base::Bind(&MediaRouterIntegrationBrowserTest::IsDialogClosed,
+                 base::Unretained(this), web_contents)));
+}
+
 void MediaRouterIntegrationBrowserTest::SetTestData(
     base::FilePath::StringPieceType test_data_file) {
   base::FilePath full_path = GetResourceFile(test_data_file);
diff --git a/chrome/test/media_router/media_router_integration_browsertest.h b/chrome/test/media_router/media_router_integration_browsertest.h
index d8c4bef2..123e684d 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.h
+++ b/chrome/test/media_router/media_router_integration_browsertest.h
@@ -46,11 +46,18 @@
   static std::string ExecuteScriptAndExtractString(
       const content::ToRenderFrameHost& adapter, const std::string& script);
 
+  void ClickDialog();
+
   // Get the chrome modal dialog.
   // |web_contents|: The web contents of the test page which invokes the popup
   //                 dialog.
   content::WebContents* GetMRDialog(content::WebContents* web_contents);
 
+  // Checks that the chrome modal dialog does not exist.
+  bool IsDialogClosed(content::WebContents* web_contents);
+  void WaitUntilDialogClosed(content::WebContents* web_contents);
+  void CheckDialogRemainsOpen(content::WebContents* web_contents);
+
   void OpenTestPage(base::FilePath::StringPieceType file);
   void OpenTestPageInNewTab(base::FilePath::StringPieceType file);
 
diff --git a/chrome/test/media_router/media_router_integration_ui_browsertest.cc b/chrome/test/media_router/media_router_integration_ui_browsertest.cc
index 0f8cd37..a77f86f 100644
--- a/chrome/test/media_router/media_router_integration_ui_browsertest.cc
+++ b/chrome/test/media_router/media_router_integration_ui_browsertest.cc
@@ -34,6 +34,12 @@
   ChooseSink(web_contents, kTestSinkName);
   WaitUntilRouteCreated();
 
+  // Simulate a click on the dialog to prevent it from automatically closing
+  // after the route has been created. Then, check that the dialog remains
+  // open.
+  ClickDialog();
+  CheckDialogRemainsOpen(web_contents);
+
   // Verify the route details page.
   std::string route_info_script = base::StringPrintf(
       "domAutomationController.send("
@@ -56,6 +62,10 @@
 
   // Close route.
   CloseRouteOnUI();
+
+  // Do not simulate a click on the dialog. Confirm that the dialog closes
+  // automatically after the route is closed.
+  WaitUntilDialogClosed(web_contents);
 }
 
 IN_PROC_BROWSER_TEST_F(MediaRouterIntegrationBrowserTest,
diff --git a/chrome/tools/build/mac/verify_order b/chrome/tools/build/mac/verify_order
index 3d5d644a..cfa4c5a 100755
--- a/chrome/tools/build/mac/verify_order
+++ b/chrome/tools/build/mac/verify_order
@@ -12,6 +12,8 @@
 #
 # This script can be used to verify that all of the global text symbols in
 # a Mach-O file are accounted for in an order file.
+#
+# Also check that the file does not depend on either of libstdc++ or libc++.
 
 if [ ${#} -ne 2 ] ; then
   echo "usage: ${0} LAST_SYMBOL MACH_O_FILE" >& 2
@@ -40,4 +42,18 @@
   exit 1
 fi
 
+LIBS=$(otool -L "${MACH_O_FILE}")
+if [ ${?} -ne 0 ] ; then
+  echo "${0}: failed to get libraries in ${MACH_O_FILE}" >& 2
+  exit 1
+fi
+if grep -Fq libstdc++ <<< ${LIBS} ; then
+  echo "${0}: ${MACH_O_FILE} depends on libstdc++" >& 2
+  exit 1
+fi
+if grep -Fq libc++ <<< ${LIBS} ; then
+  echo "${0}: ${MACH_O_FILE} depends on libc++" >& 2
+  exit 1
+fi
+
 exit 0
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index f5cf9c0..5fc19ab 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-7573.0.0
\ No newline at end of file
+7576.0.0
\ No newline at end of file
diff --git a/content/browser/background_sync/background_sync_browsertest.cc b/content/browser/background_sync/background_sync_browsertest.cc
index e90fd7f..8fc9da1 100644
--- a/content/browser/background_sync/background_sync_browsertest.cc
+++ b/content/browser/background_sync/background_sync_browsertest.cc
@@ -178,8 +178,8 @@
       const std::vector<std::string>& expected_tags);
   bool CompleteDelayedOneShot();
   bool RejectDelayedOneShot();
-  bool NotifyWhenDoneOneShot(const std::string& tag);
-  bool NotifyWhenDoneImmediateOneShot(const std::string& expected_msg);
+  bool NotifyWhenFinishedOneShot(const std::string& tag);
+  bool NotifyWhenFinishedImmediateOneShot(const std::string& expected_msg);
   bool StoreRegistrationOneShot(const std::string& tag);
 
  private:
@@ -350,16 +350,19 @@
   return script_result == BuildExpectedResult("delay", "rejecting");
 }
 
-bool BackgroundSyncBrowserTest::NotifyWhenDoneOneShot(const std::string& tag) {
+bool BackgroundSyncBrowserTest::NotifyWhenFinishedOneShot(
+    const std::string& tag) {
   EXPECT_TRUE(content::ExecuteScript(
-      shell_->web_contents(), BuildScriptString("notifyWhenDoneOneShot", tag)));
-  return PopConsole(BuildExpectedResult(tag, "done"));
+      shell_->web_contents(),
+      BuildScriptString("notifyWhenFinishedOneShot", tag)));
+  return PopConsole(BuildExpectedResult(tag, "finished"));
 }
 
-bool BackgroundSyncBrowserTest::NotifyWhenDoneImmediateOneShot(
+bool BackgroundSyncBrowserTest::NotifyWhenFinishedImmediateOneShot(
     const std::string& expected_msg) {
   std::string script_result;
-  EXPECT_TRUE(RunScript("notifyWhenDoneImmediateOneShot()", &script_result));
+  EXPECT_TRUE(
+      RunScript("notifyWhenFinishedImmediateOneShot()", &script_result));
   return script_result == expected_msg;
 }
 
@@ -424,7 +427,7 @@
   EXPECT_TRUE(PopConsole("ok - delay completed"));
 
   // Verify that it finished firing.
-  // TODO(jkarlin): Use registration.done to verify that the event actually
+  // TODO(jkarlin): Use registration.finished to verify that the event actually
   // completed successfully.
   EXPECT_FALSE(GetRegistrationOneShot("delay"));
 }
@@ -561,38 +564,40 @@
   EXPECT_TRUE(PopConsole("ok - unregister completed"));
 }
 
-IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallDoneBeforeSyncSucceeds) {
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest,
+                       CallFinishedBeforeSyncSucceeds) {
   EXPECT_TRUE(RegisterServiceWorker());
   EXPECT_TRUE(LoadTestPage(kDefaultTestURL));  // Control the page.
 
   SetOnline(false);
   EXPECT_TRUE(RegisterOneShot("foo"));
-  EXPECT_TRUE(NotifyWhenDoneOneShot("foo"));
+  EXPECT_TRUE(NotifyWhenFinishedOneShot("foo"));
 
   SetOnline(true);
   // The ordering of PopConsole messages tells us that the event fired
-  // before done resolved.
+  // before finished resolved.
   EXPECT_TRUE(PopConsole("foo fired"));
-  EXPECT_TRUE(PopConsole("foo done result: true"));
+  EXPECT_TRUE(PopConsole("foo finished result: true"));
 }
 
-IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallDoneBeforeSyncFails) {
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallFinishedBeforeSyncFails) {
   EXPECT_TRUE(RegisterServiceWorker());
   EXPECT_TRUE(LoadTestPage(kDefaultTestURL));  // Control the page.
 
   SetOnline(true);
   EXPECT_TRUE(RegisterOneShot("delay"));
   EXPECT_FALSE(OneShotPending("delay"));
-  EXPECT_TRUE(NotifyWhenDoneOneShot("delay"));
+  EXPECT_TRUE(NotifyWhenFinishedOneShot("delay"));
 
   EXPECT_TRUE(RejectDelayedOneShot());
   // The ordering of PopConsole messages tells us that the event fired
-  // before done resolved.
+  // before finished resolved.
   EXPECT_TRUE(PopConsole("ok - delay rejected"));
-  EXPECT_TRUE(PopConsole("delay done result: false"));
+  EXPECT_TRUE(PopConsole("delay finished result: false"));
 }
 
-IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallDoneAfterSyncSuceeds) {
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest,
+                       CallFinishedAfterSyncSuceeds) {
   EXPECT_TRUE(RegisterServiceWorker());
   EXPECT_TRUE(LoadTestPage(kDefaultTestURL));  // Control the page.
 
@@ -603,11 +608,11 @@
   SetOnline(true);
   EXPECT_TRUE(PopConsole("foo fired"));
   EXPECT_FALSE(GetRegistrationOneShot("foo"));
-  EXPECT_TRUE(NotifyWhenDoneImmediateOneShot("ok - foo result: true"));
+  EXPECT_TRUE(NotifyWhenFinishedImmediateOneShot("ok - foo result: true"));
 }
 
 IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest,
-                       CallDoneAfterSyncUnregistered) {
+                       CallFinishedAfterSyncUnregistered) {
   EXPECT_TRUE(RegisterServiceWorker());
   EXPECT_TRUE(LoadTestPage(kDefaultTestURL));  // Control the page.
 
@@ -616,10 +621,10 @@
   EXPECT_TRUE(StoreRegistrationOneShot("foo"));
   EXPECT_TRUE(UnregisterOneShot("foo"));
   EXPECT_FALSE(GetRegistrationOneShot("foo"));
-  EXPECT_TRUE(NotifyWhenDoneImmediateOneShot("ok - foo result: false"));
+  EXPECT_TRUE(NotifyWhenFinishedImmediateOneShot("ok - foo result: false"));
 }
 
-IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallDoneAfterSyncFails) {
+IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, CallFinishedAfterSyncFails) {
   EXPECT_TRUE(RegisterServiceWorker());
   EXPECT_TRUE(LoadTestPage(kDefaultTestURL));  // Control the page.
 
@@ -630,7 +635,7 @@
 
   EXPECT_TRUE(RejectDelayedOneShot());
   EXPECT_TRUE(PopConsole("ok - delay rejected"));
-  EXPECT_TRUE(NotifyWhenDoneImmediateOneShot("ok - delay result: false"));
+  EXPECT_TRUE(NotifyWhenFinishedImmediateOneShot("ok - delay result: false"));
 }
 
 }  // namespace content
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
index 96e41e8..5c3289d 100644
--- a/content/browser/background_sync/background_sync_manager.cc
+++ b/content/browser/background_sync/background_sync_manager.cc
@@ -834,7 +834,7 @@
       FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_OK));
 }
 
-void BackgroundSyncManager::NotifyWhenDone(
+void BackgroundSyncManager::NotifyWhenFinished(
     BackgroundSyncRegistrationHandle::HandleId handle_id,
     const StatusAndStateCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -850,12 +850,12 @@
       DuplicateRegistrationHandle(handle_id);
 
   op_scheduler_.ScheduleOperation(
-      base::Bind(&BackgroundSyncManager::NotifyWhenDoneImpl,
+      base::Bind(&BackgroundSyncManager::NotifyWhenFinishedImpl,
                  weak_ptr_factory_.GetWeakPtr(),
                  base::Passed(registration_handle.Pass()), callback));
 }
 
-void BackgroundSyncManager::NotifyWhenDoneImpl(
+void BackgroundSyncManager::NotifyWhenFinishedImpl(
     scoped_ptr<BackgroundSyncRegistrationHandle> registration_handle,
     const StatusAndStateCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -869,8 +869,8 @@
   }
 
   if (!registration_handle->registration()->HasCompleted()) {
-    registration_handle->registration()->AddDoneCallback(
-        base::Bind(&BackgroundSyncManager::NotifyWhenDoneDidFinish,
+    registration_handle->registration()->AddFinishedCallback(
+        base::Bind(&BackgroundSyncManager::NotifyWhenFinishedInvokeCallback,
                    weak_ptr_factory_.GetWeakPtr(), callback));
     op_scheduler_.CompleteOperationAndRunNext();
     return;
@@ -882,7 +882,7 @@
   op_scheduler_.CompleteOperationAndRunNext();
 }
 
-void BackgroundSyncManager::NotifyWhenDoneDidFinish(
+void BackgroundSyncManager::NotifyWhenFinishedInvokeCallback(
     const StatusAndStateCallback& callback,
     BackgroundSyncState sync_state) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -1143,7 +1143,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   // Do not check for disabled as events that were firing when disabled should
-  // be allowed to complete (for NotifyWhenDone).
+  // be allowed to complete (for NotifyWhenFinished).
 
   op_scheduler_.ScheduleOperation(base::Bind(
       &BackgroundSyncManager::EventCompleteImpl, weak_ptr_factory_.GetWeakPtr(),
@@ -1180,12 +1180,12 @@
       // TODO(jkarlin): Insert retry logic here. Be sure to check if the state
       // is UNREGISTERED_WHILE_FIRING first. If so then set the state to failed
       // if it was already out of retry attempts otherwise keep the state as
-      // unregistered. Then call RunDoneCallbacks(); (crbug.com/501838)
+      // unregistered. Then call RunFinishedCallbacks(); (crbug.com/501838)
       registration->set_sync_state(BACKGROUND_SYNC_STATE_FAILED);
-      registration->RunDoneCallbacks();
+      registration->RunFinishedCallbacks();
     } else {
       registration->set_sync_state(BACKGROUND_SYNC_STATE_SUCCESS);
-      registration->RunDoneCallbacks();
+      registration->RunFinishedCallbacks();
     }
 
     RegistrationKey key(*registration);
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h
index 65f5ff20..ff6994e 100644
--- a/content/browser/background_sync/background_sync_manager.h
+++ b/content/browser/background_sync/background_sync_manager.h
@@ -244,16 +244,16 @@
                           const StatusCallback& callback,
                           ServiceWorkerStatusCode status);
 
-  // NotifyWhenDone and its callbacks. See
-  // BackgroundSyncRegistrationHandle::NotifyWhenDone for detailed
+  // NotifyWhenFinished and its callbacks. See
+  // BackgroundSyncRegistrationHandle::NotifyWhenFinished for detailed
   // documentation.
-  void NotifyWhenDone(BackgroundSyncRegistrationHandle::HandleId handle_id,
-                      const StatusAndStateCallback& callback);
-  void NotifyWhenDoneImpl(
+  void NotifyWhenFinished(BackgroundSyncRegistrationHandle::HandleId handle_id,
+                          const StatusAndStateCallback& callback);
+  void NotifyWhenFinishedImpl(
       scoped_ptr<BackgroundSyncRegistrationHandle> registration_handle,
       const StatusAndStateCallback& callback);
-  void NotifyWhenDoneDidFinish(const StatusAndStateCallback& callback,
-                               BackgroundSyncState status);
+  void NotifyWhenFinishedInvokeCallback(const StatusAndStateCallback& callback,
+                                        BackgroundSyncState status);
 
   // GetRegistration callbacks
   void GetRegistrationImpl(int64 sw_registration_id,
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index c1fe475..6e34c8c 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -87,11 +87,11 @@
   *out_callback = callback;
 }
 
-void NotifyWhenDoneCallback(bool* was_called,
-                            BackgroundSyncStatus* out_status,
-                            BackgroundSyncState* out_state,
-                            BackgroundSyncStatus status,
-                            BackgroundSyncState state) {
+void NotifyWhenFinishedCallback(bool* was_called,
+                                BackgroundSyncStatus* out_status,
+                                BackgroundSyncState* out_state,
+                                BackgroundSyncStatus status,
+                                BackgroundSyncState state) {
   *was_called = true;
   *out_status = status;
   *out_state = state;
@@ -1068,60 +1068,63 @@
   EXPECT_FALSE(GetRegistration(sync_options_1_));
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneAfterEventSuccess) {
+TEST_F(BackgroundSyncManagerTest, NotifyWhenFinishedAfterEventSuccess) {
   InitSyncEventTest();
 
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_EQ(1, sync_events_called_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_SUCCESS, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneBeforeEventSuccess) {
+TEST_F(BackgroundSyncManagerTest, NotifyWhenFinishedBeforeEventSuccess) {
   InitDelayedSyncEventTest();
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Finish firing the event.
   sync_fired_callback_.Run(SERVICE_WORKER_OK);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, sync_events_called_);
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_SUCCESS, sync_state);
 }
 
 TEST_F(BackgroundSyncManagerTest,
-       NotifyWhenDoneBeforeUnregisteredEventSuccess) {
+       NotifyWhenFinishedBeforeUnregisteredEventSuccess) {
   InitDelayedSyncEventTest();
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
-  // Unregistering should set the state to UNREGISTERED but done shouldn't
+  // Unregistering should set the state to UNREGISTERED but finished shouldn't
   // be called until the event finishes firing, at which point its state should
   // be SUCCESS.
   EXPECT_TRUE(Unregister(callback_registration_handle_.get()));
@@ -1131,26 +1134,27 @@
   sync_fired_callback_.Run(SERVICE_WORKER_OK);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, sync_events_called_);
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_SUCCESS, sync_state);
 }
 
 TEST_F(BackgroundSyncManagerTest,
-       NotifyWhenDoneBeforeUnregisteredEventFailure) {
+       NotifyWhenFinishedBeforeUnregisteredEventFailure) {
   InitDelayedSyncEventTest();
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
-  // Unregistering should set the state to UNREGISTERED but done shouldn't
+  // Unregistering should set the state to UNREGISTERED but finished shouldn't
   // be called until the event finishes firing, at which point its state should
   // be FAILED.
   EXPECT_TRUE(Unregister(callback_registration_handle_.get()));
@@ -1160,122 +1164,129 @@
   sync_fired_callback_.Run(SERVICE_WORKER_ERROR_FAILED);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, sync_events_called_);
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_FAILED, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneBeforeUnregisteredEventFires) {
+TEST_F(BackgroundSyncManagerTest,
+       NotifyWhenFinishedBeforeUnregisteredEventFires) {
   InitSyncEventTest();
 
   SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE);
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_TRUE(Unregister(callback_registration_handle_.get()));
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_UNREGISTERED, sync_state);
 }
 
 TEST_F(BackgroundSyncManagerTest,
-       NotifyWhenDoneBeforeEventSuccessDroppedHandle) {
+       NotifyWhenFinishedBeforeEventSuccessDroppedHandle) {
   InitDelayedSyncEventTest();
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
 
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Drop the client's handle to the registration before the event fires, ensure
-  // that the done callback is still run.
+  // that the finished callback is still run.
   callback_registration_handle_ = nullptr;
 
   // Finish firing the event.
   sync_fired_callback_.Run(SERVICE_WORKER_OK);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, sync_events_called_);
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_SUCCESS, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneAfterEventFailure) {
+TEST_F(BackgroundSyncManagerTest, NotifyWhenFinishedAfterEventFailure) {
   InitFailedSyncEventTest();
 
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_EQ(1, sync_events_called_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_FAILED, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneBeforeEventFailure) {
+TEST_F(BackgroundSyncManagerTest, NotifyWhenFinishedBeforeEventFailure) {
   InitDelayedSyncEventTest();
 
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Finish firing the event.
   sync_fired_callback_.Run(SERVICE_WORKER_ERROR_FAILED);
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_FAILED, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneAfterUnregistered) {
+TEST_F(BackgroundSyncManagerTest, NotifyWhenFinishedAfterUnregistered) {
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_TRUE(Unregister(callback_registration_handle_.get()));
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_UNREGISTERED, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, NotifyWhenDoneBeforeUnregistered) {
+TEST_F(BackgroundSyncManagerTest, NotifyWhenFinishedBeforeUnregistered) {
   Register(sync_options_1_);
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   EXPECT_TRUE(Unregister(callback_registration_handle_.get()));
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_UNREGISTERED, sync_state);
 }
@@ -1298,13 +1309,14 @@
   EXPECT_EQ(POWER_STATE_AUTO,
             callback_registration_handle_->options()->power_state);
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  original_handle->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  original_handle->NotifyWhenFinished(base::Bind(&NotifyWhenFinishedCallback,
+                                                 &notify_finished_called,
+                                                 &status, &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_UNREGISTERED, sync_state);
   EXPECT_EQ(0, sync_events_called_);
@@ -1327,19 +1339,20 @@
   sync_options_1_.power_state = POWER_STATE_AUTO;
   EXPECT_TRUE(Register(sync_options_1_));
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  original_handle->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  original_handle->NotifyWhenFinished(base::Bind(&NotifyWhenFinishedCallback,
+                                                 &notify_finished_called,
+                                                 &status, &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Successfully finish the first event.
   sync_fired_callback_.Run(SERVICE_WORKER_OK);
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_SUCCESS, sync_state);
 }
@@ -1361,24 +1374,25 @@
   sync_options_1_.power_state = POWER_STATE_AUTO;
   EXPECT_TRUE(Register(sync_options_1_));
 
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  original_handle->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  original_handle->NotifyWhenFinished(base::Bind(&NotifyWhenFinishedCallback,
+                                                 &notify_finished_called,
+                                                 &status, &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Fail the first event.
   sync_fired_callback_.Run(SERVICE_WORKER_ERROR_FAILED);
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, status);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_FAILED, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, DisableWhilePendingNotifiesDone) {
+TEST_F(BackgroundSyncManagerTest, DisableWhilePendingNotifiesFinished) {
   InitSyncEventTest();
 
   // Register a one-shot that must wait for network connectivity before it
@@ -1387,50 +1401,52 @@
   EXPECT_TRUE(Register(sync_options_1_));
 
   // Listen for notification of completion.
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Corrupting the backend should result in the manager disabling itself on the
   // next operation. While disabling, it should finalize any pending
   // registrations.
   test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_2_));
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_UNREGISTERED, sync_state);
 }
 
-TEST_F(BackgroundSyncManagerTest, DisableWhileFiringNotifiesDone) {
+TEST_F(BackgroundSyncManagerTest, DisableWhileFiringNotifiesFinished) {
   InitDelayedSyncEventTest();
 
   // Register a one-shot that pauses mid-fire.
   RegisterAndVerifySyncEventDelayed(sync_options_1_);
 
   // Listen for notification of completion.
-  bool notify_done_called = false;
+  bool notify_finished_called = false;
   BackgroundSyncStatus status = BACKGROUND_SYNC_STATUS_OK;
   BackgroundSyncState sync_state = BACKGROUND_SYNC_STATE_SUCCESS;
-  callback_registration_handle_->NotifyWhenDone(base::Bind(
-      &NotifyWhenDoneCallback, &notify_done_called, &status, &sync_state));
+  callback_registration_handle_->NotifyWhenFinished(
+      base::Bind(&NotifyWhenFinishedCallback, &notify_finished_called, &status,
+                 &sync_state));
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
 
   // Corrupting the backend should result in the manager disabling itself on the
   // next operation. Even though the manager is disabled, the firing sync event
   // should still be able to complete successfully and notify as much.
   test_background_sync_manager_->set_corrupt_backend(true);
   EXPECT_FALSE(Register(sync_options_2_));
-  EXPECT_FALSE(notify_done_called);
+  EXPECT_FALSE(notify_finished_called);
   test_background_sync_manager_->set_corrupt_backend(false);
 
   // Successfully complete the firing event.
   sync_fired_callback_.Run(SERVICE_WORKER_OK);
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(notify_done_called);
+  EXPECT_TRUE(notify_finished_called);
   EXPECT_EQ(BACKGROUND_SYNC_STATE_SUCCESS, sync_state);
 }
 
diff --git a/content/browser/background_sync/background_sync_registration.cc b/content/browser/background_sync/background_sync_registration.cc
index d3da8e8e..14bdc46a 100644
--- a/content/browser/background_sync/background_sync_registration.cc
+++ b/content/browser/background_sync/background_sync_registration.cc
@@ -30,21 +30,21 @@
   return id_ != kInvalidRegistrationId;
 }
 
-void BackgroundSyncRegistration::AddDoneCallback(
+void BackgroundSyncRegistration::AddFinishedCallback(
     const StateCallback& callback) {
   DCHECK(!HasCompleted());
-  notify_done_callbacks_.push_back(callback);
+  notify_finished_callbacks_.push_back(callback);
 }
 
-void BackgroundSyncRegistration::RunDoneCallbacks() {
+void BackgroundSyncRegistration::RunFinishedCallbacks() {
   DCHECK(HasCompleted());
 
-  for (auto& callback : notify_done_callbacks_) {
+  for (auto& callback : notify_finished_callbacks_) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::Bind(callback, sync_state_));
   }
 
-  notify_done_callbacks_.clear();
+  notify_finished_callbacks_.clear();
 }
 
 bool BackgroundSyncRegistration::HasCompleted() const {
@@ -72,9 +72,9 @@
 
   if (!firing) {
     // If the registration is currently firing then wait to run
-    // RunDoneCallbacks until after it has finished as it might
+    // RunFinishedCallbacks until after it has finished as it might
     // change state to SUCCESS first.
-    RunDoneCallbacks();
+    RunFinishedCallbacks();
   }
 }
 
diff --git a/content/browser/background_sync/background_sync_registration.h b/content/browser/background_sync/background_sync_registration.h
index 556aad0..084ca1f 100644
--- a/content/browser/background_sync/background_sync_registration.h
+++ b/content/browser/background_sync/background_sync_registration.h
@@ -30,13 +30,14 @@
 
   bool Equals(const BackgroundSyncRegistration& other) const;
   bool IsValid() const;
-  void AddDoneCallback(const StateCallback& callback);
-  void RunDoneCallbacks();
+  void AddFinishedCallback(const StateCallback& callback);
+  void RunFinishedCallbacks();
   bool HasCompleted() const;
 
   // If the registration is currently firing, sets its state to
   // BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING. If it is firing, it sets
-  // the state to BACKGROUND_SYNC_STATE_UNREGISTERED and calls RunDoneCallbacks.
+  // the state to BACKGROUND_SYNC_STATE_UNREGISTERED and calls
+  // RunFinishedCallbacks.
   void SetUnregisteredState();
 
   const BackgroundSyncRegistrationOptions* options() const { return &options_; }
@@ -55,7 +56,7 @@
   RegistrationId id_ = kInvalidRegistrationId;
   BackgroundSyncState sync_state_ = BACKGROUND_SYNC_STATE_PENDING;
 
-  std::list<StateCallback> notify_done_callbacks_;
+  std::list<StateCallback> notify_finished_callbacks_;
 
   DISALLOW_COPY_AND_ASSIGN(BackgroundSyncRegistration);
 };
diff --git a/content/browser/background_sync/background_sync_registration_handle.cc b/content/browser/background_sync/background_sync_registration_handle.cc
index 7cb2672..eca0abbb 100644
--- a/content/browser/background_sync/background_sync_registration_handle.cc
+++ b/content/browser/background_sync/background_sync_registration_handle.cc
@@ -26,13 +26,13 @@
                                        callback);
 }
 
-void BackgroundSyncRegistrationHandle::NotifyWhenDone(
+void BackgroundSyncRegistrationHandle::NotifyWhenFinished(
     const StatusAndStateCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(IsValid());
   DCHECK(background_sync_manager_);
 
-  background_sync_manager_->NotifyWhenDone(handle_id_, callback);
+  background_sync_manager_->NotifyWhenFinished(handle_id_, callback);
 }
 
 bool BackgroundSyncRegistrationHandle::IsValid() const {
diff --git a/content/browser/background_sync/background_sync_registration_handle.h b/content/browser/background_sync/background_sync_registration_handle.h
index 85f21dff..c738179 100644
--- a/content/browser/background_sync/background_sync_registration_handle.h
+++ b/content/browser/background_sync/background_sync_registration_handle.h
@@ -50,9 +50,9 @@
   // succeeded. The provided state is BACKGROUND_SYNC_STATE_SUCCESS on success,
   // BACKGRUOND_SYNC_STATE_FAILED on final failure, and
   // BACKGROUND_SYNC_STATE_UNREGISTERED if the registration was unregistered
-  // before it could complete. NotifyWhenDone should only be called for
+  // before it could complete. NotifyWhenFinished should only be called for
   // SYNC_ONE_SHOT registrations.
-  void NotifyWhenDone(const StatusAndStateCallback& callback);
+  void NotifyWhenFinished(const StatusAndStateCallback& callback);
 
   // Returns true if the handle is backed by a BackgroundSyncRegistration in the
   // BackgroundSyncManager.
diff --git a/content/browser/background_sync/background_sync_service_impl.cc b/content/browser/background_sync/background_sync_service_impl.cc
index aef8b45..ead436f 100644
--- a/content/browser/background_sync/background_sync_service_impl.cc
+++ b/content/browser/background_sync/background_sync_service_impl.cc
@@ -226,9 +226,9 @@
   active_handles_.Remove(handle_id);
 }
 
-void BackgroundSyncServiceImpl::NotifyWhenDone(
+void BackgroundSyncServiceImpl::NotifyWhenFinished(
     BackgroundSyncRegistrationHandle::HandleId handle_id,
-    const NotifyWhenDoneCallback& callback) {
+    const NotifyWhenFinishedCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   BackgroundSyncRegistrationHandle* registration =
       active_handles_.Lookup(handle_id);
@@ -238,8 +238,8 @@
     return;
   }
 
-  registration->NotifyWhenDone(
-      base::Bind(&BackgroundSyncServiceImpl::OnNotifyWhenDoneResult,
+  registration->NotifyWhenFinished(
+      base::Bind(&BackgroundSyncServiceImpl::OnNotifyWhenFinishedResult,
                  weak_ptr_factory_.GetWeakPtr(), callback));
 }
 
@@ -287,8 +287,8 @@
                mojo_registrations.Pass());
 }
 
-void BackgroundSyncServiceImpl::OnNotifyWhenDoneResult(
-    const NotifyWhenDoneCallback& callback,
+void BackgroundSyncServiceImpl::OnNotifyWhenFinishedResult(
+    const NotifyWhenFinishedCallback& callback,
     BackgroundSyncStatus status,
     BackgroundSyncState sync_state) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/content/browser/background_sync/background_sync_service_impl.h b/content/browser/background_sync/background_sync_service_impl.h
index 828b53bd..ad8e5339 100644
--- a/content/browser/background_sync/background_sync_service_impl.h
+++ b/content/browser/background_sync/background_sync_service_impl.h
@@ -52,8 +52,8 @@
       const DuplicateRegistrationHandleCallback& callback) override;
   void ReleaseRegistration(
       BackgroundSyncRegistrationHandle::HandleId handle_id) override;
-  void NotifyWhenDone(BackgroundSyncRegistrationHandle::HandleId handle_id,
-                      const NotifyWhenDoneCallback& callback) override;
+  void NotifyWhenFinished(BackgroundSyncRegistrationHandle::HandleId handle_id,
+                          const NotifyWhenFinishedCallback& callback) override;
 
   void OnRegisterResult(const RegisterCallback& callback,
                         BackgroundSyncStatus status,
@@ -64,9 +64,9 @@
       const GetRegistrationsCallback& callback,
       BackgroundSyncStatus status,
       scoped_ptr<ScopedVector<BackgroundSyncRegistrationHandle>> result);
-  void OnNotifyWhenDoneResult(const NotifyWhenDoneCallback& callback,
-                              BackgroundSyncStatus status,
-                              BackgroundSyncState sync_state);
+  void OnNotifyWhenFinishedResult(const NotifyWhenFinishedCallback& callback,
+                                  BackgroundSyncStatus status,
+                                  BackgroundSyncState sync_state);
 
   // Called when an error is detected on binding_.
   void OnConnectionError();
diff --git a/content/browser/background_sync/background_sync_service_impl_unittest.cc b/content/browser/background_sync/background_sync_service_impl_unittest.cc
index 52352a9..5b06a94 100644
--- a/content/browser/background_sync/background_sync_service_impl_unittest.cc
+++ b/content/browser/background_sync/background_sync_service_impl_unittest.cc
@@ -246,8 +246,8 @@
 
   void NotifyWhenDone(
       int32 handle_id,
-      const BackgroundSyncService::NotifyWhenDoneCallback& callback) {
-    service_impl_->NotifyWhenDone(handle_id, callback);
+      const BackgroundSyncService::NotifyWhenFinishedCallback& callback) {
+    service_impl_->NotifyWhenFinished(handle_id, callback);
     base::RunLoop().RunUntilIdle();
   }
 
@@ -419,7 +419,7 @@
   EXPECT_EQ(1UL, array_size);
 }
 
-TEST_F(BackgroundSyncServiceImplTest, NotifyWhenDone) {
+TEST_F(BackgroundSyncServiceImplTest, NotifyWhenFinished) {
   // Register a sync event.
   bool register_called = false;
   BackgroundSyncError register_error;
diff --git a/content/browser/media/android/browser_demuxer_android.cc b/content/browser/media/android/browser_demuxer_android.cc
index aab876394..997b4318 100644
--- a/content/browser/media/android/browser_demuxer_android.cc
+++ b/content/browser/media/android/browser_demuxer_android.cc
@@ -55,8 +55,11 @@
 
 BrowserDemuxerAndroid::BrowserDemuxerAndroid()
     : BrowserMessageFilter(MediaPlayerMsgStart) {
+  const bool use_media_thread = media::UseMediaThreadForMediaPlayback();
+  VLOG(1) << "Using " << (use_media_thread ? "media" : "UI") << " thread"
+          << " for MSE playback";
   task_runner_ =
-      media::UseMediaThreadForMediaPlayback() ?
+      use_media_thread ?
       media::GetMediaTaskRunner().get() :
       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get();
 
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc b/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc
index c47605c2..be8f2b0 100644
--- a/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_aura.cc
@@ -118,7 +118,8 @@
           false),
       touch_down_(false),
       scroll_in_progress_(false),
-      handle_drag_in_progress_(false) {
+      handle_drag_in_progress_(false),
+      insertion_quick_menu_allowed_(true) {
   DCHECK(rwhva_);
 }
 
@@ -152,7 +153,20 @@
 }
 
 bool TouchSelectionControllerClientAura::IsQuickMenuAllowed() const {
-  return !touch_down_ && !scroll_in_progress_ && !handle_drag_in_progress_;
+  if (touch_down_ || scroll_in_progress_ || handle_drag_in_progress_)
+    return false;
+
+  switch (rwhva_->selection_controller()->active_status()) {
+    case ui::TouchSelectionController::INACTIVE:
+      return false;
+    case ui::TouchSelectionController::INSERTION_ACTIVE:
+      return insertion_quick_menu_allowed_;
+    case ui::TouchSelectionController::SELECTION_ACTIVE:
+      return true;
+  }
+
+  NOTREACHED();
+  return false;
 }
 
 void TouchSelectionControllerClientAura::ShowQuickMenu() {
@@ -191,9 +205,6 @@
   bool menu_is_showing =
       ui::TouchSelectionMenuRunner::GetInstance() &&
       ui::TouchSelectionMenuRunner::GetInstance()->IsRunning();
-  bool menu_should_show = rwhva_->selection_controller()->active_status() !=
-                              ui::TouchSelectionController::INACTIVE &&
-                          IsQuickMenuAllowed();
 
   // Hide the quick menu if there is any. This should happen even if the menu
   // should be shown again, in order to update its location or content.
@@ -203,7 +214,7 @@
     quick_menu_timer_.Stop();
 
   // Start timer to show quick menu if necessary.
-  if (menu_should_show) {
+  if (IsQuickMenuAllowed()) {
     if (show_quick_menu_immediately_for_test_)
       ShowQuickMenu();
     else
@@ -250,6 +261,7 @@
   switch (event) {
     case ui::SELECTION_HANDLES_SHOWN:
     case ui::INSERTION_HANDLE_SHOWN:
+      insertion_quick_menu_allowed_ = false;
       UpdateQuickMenu();
       env_pre_target_handler_.reset(new EnvPreTargetHandler(
           rwhva_->selection_controller(), rwhva_->GetNativeView()));
@@ -271,9 +283,13 @@
       break;
     case ui::SELECTION_HANDLES_MOVED:
     case ui::INSERTION_HANDLE_MOVED:
+      insertion_quick_menu_allowed_ = false;
       UpdateQuickMenu();
       break;
     case ui::INSERTION_HANDLE_TAPPED:
+      insertion_quick_menu_allowed_ = !insertion_quick_menu_allowed_;
+      UpdateQuickMenu();
+      break;
     case ui::SELECTION_ESTABLISHED:
     case ui::SELECTION_DISSOLVED:
       break;
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_aura.h b/content/browser/renderer_host/input/touch_selection_controller_client_aura.h
index bb9dd66..0c2f6fe6 100644
--- a/content/browser/renderer_host/input/touch_selection_controller_client_aura.h
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_aura.h
@@ -65,6 +65,7 @@
   bool touch_down_;
   bool scroll_in_progress_;
   bool handle_drag_in_progress_;
+  bool insertion_quick_menu_allowed_;
 
   bool show_quick_menu_immediately_for_test_;
 
diff --git a/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc b/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc
index 999b1cd0b4..c8b2cee 100644
--- a/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc
+++ b/content/browser/renderer_host/input/touch_selection_controller_client_aura_browsertest.cc
@@ -159,7 +159,7 @@
   DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientAuraTest);
 };
 
-// Tests if long-pressing on a text brings up selection handles and the quick
+// Tests that long-pressing on a text brings up selection handles and the quick
 // menu properly.
 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, BasicSelection) {
   // Set the test page up.
@@ -190,15 +190,17 @@
 
   selection_controller_client->Wait();
 
-  // Check if selection is active and the quick menu is showing.
+  // Check that selection is active and the quick menu is showing.
   EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE,
             rwhva->selection_controller()->active_status());
   EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
 }
 
-// Tests if tapping in a textfield brings up the insertion handle and the quick
-// menu properly.
-IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, BasicInsertion) {
+// Tests that tapping in a textfield brings up the insertion handle, but not the
+// quick menu, initially. Then, successive taps on the insertion handle toggle
+// the quick menu visibility.
+IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest,
+                       BasicInsertionFollowedByTapsOnHandle) {
   // Set the test page up.
   ASSERT_NO_FATAL_FAILURE(StartTestWithPage("files/touch_selection.html"));
   WebContents* web_contents =
@@ -214,27 +216,43 @@
             rwhva->selection_controller()->active_status());
   EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
 
+  ui::test::EventGeneratorDelegate* generator_delegate =
+      ui::test::EventGenerator::default_delegate;
+  ui::test::EventGenerator generator(
+      web_contents->GetContentNativeView()->GetRootWindow());
+
   // Tap inside the textfield and wait for the insertion handle to appear.
   selection_controller_client->InitWaitForSelectionEvent(
       ui::INSERTION_HANDLE_SHOWN);
 
-  gfx::PointF point;
-  ASSERT_TRUE(GetPointInsideTextfield(&point));
-  ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP);
-  tap_details.set_tap_count(1);
-  ui::GestureEvent tap(point.x(), point.y(), 0, ui::EventTimeForNow(),
-                       tap_details);
-  rwhva->OnGestureEvent(&tap);
+  gfx::PointF point_f;
+  ASSERT_TRUE(GetPointInsideTextfield(&point_f));
+  gfx::Point point = gfx::ToRoundedPoint(point_f);
+  generator_delegate->ConvertPointFromTarget(
+      web_contents->GetContentNativeView(), &point);
+  generator.GestureTapAt(point);
 
   selection_controller_client->Wait();
 
-  // Check if insertion is active and the quick menu is showing.
+  // Check that insertion is active, but the quick menu is not showing.
   EXPECT_EQ(ui::TouchSelectionController::INSERTION_ACTIVE,
             rwhva->selection_controller()->active_status());
+  EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
+
+  // Tap on the insertion handle; the quick menu should appear.
+  gfx::Point handle_center = gfx::ToRoundedPoint(
+      rwhva->selection_controller()->GetStartHandleRect().CenterPoint());
+  generator_delegate->ConvertPointFromTarget(
+      web_contents->GetContentNativeView(), &handle_center);
+  generator.GestureTapAt(handle_center);
   EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
+
+  // Tap once more on the insertion handle; the quick menu should disappear.
+  generator.GestureTapAt(handle_center);
+  EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
 }
 
-// Tests if the quick menu is hidden whenever a touch point is active.
+// Tests that the quick menu is hidden whenever a touch point is active.
 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest,
                        QuickMenuHiddenOnTouch) {
   // Set the test page up.
@@ -298,7 +316,7 @@
   EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
 }
 
-// Tests if the quick menu and touch handles are hidden during an scroll.
+// Tests that the quick menu and touch handles are hidden during an scroll.
 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, HiddenOnScroll) {
   // Set the test page up.
   ASSERT_NO_FATAL_FAILURE(StartTestWithPage("files/touch_selection.html"));
@@ -376,7 +394,7 @@
   EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning());
 }
 
-// Tests if touch selection gets deactivated after an overscroll completes.
+// Tests that touch selection gets deactivated after an overscroll completes.
 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest,
                        HiddenAfterOverscroll) {
   // Set the page up.
diff --git a/content/child/background_sync/background_sync_provider.cc b/content/child/background_sync/background_sync_provider.cc
index fb93ed30..5dab9e4 100644
--- a/content/child/background_sync/background_sync_provider.cc
+++ b/content/child/background_sync/background_sync_provider.cc
@@ -184,18 +184,19 @@
   GetBackgroundSyncServicePtr()->ReleaseRegistration(handle_id);
 }
 
-void BackgroundSyncProvider::notifyWhenDone(
+void BackgroundSyncProvider::notifyWhenFinished(
     int64_t handle_id,
-    blink::WebSyncNotifyWhenDoneCallbacks* callbacks) {
+    blink::WebSyncNotifyWhenFinishedCallbacks* callbacks) {
   DCHECK(callbacks);
 
-  scoped_ptr<blink::WebSyncNotifyWhenDoneCallbacks> callbacks_ptr(callbacks);
+  scoped_ptr<blink::WebSyncNotifyWhenFinishedCallbacks> callbacks_ptr(
+      callbacks);
 
   // base::Unretained is safe here, as the mojo channel will be deleted (and
   // will wipe its callbacks) before 'this' is deleted.
-  GetBackgroundSyncServicePtr()->NotifyWhenDone(
+  GetBackgroundSyncServicePtr()->NotifyWhenFinished(
       handle_id,
-      base::Bind(&BackgroundSyncProvider::NotifyWhenDoneCallback,
+      base::Bind(&BackgroundSyncProvider::NotifyWhenFinishedCallback,
                  base::Unretained(this), base::Passed(callbacks_ptr.Pass())));
 }
 
@@ -383,8 +384,8 @@
   }
 }
 
-void BackgroundSyncProvider::NotifyWhenDoneCallback(
-    scoped_ptr<blink::WebSyncNotifyWhenDoneCallbacks> callbacks,
+void BackgroundSyncProvider::NotifyWhenFinishedCallback(
+    scoped_ptr<blink::WebSyncNotifyWhenFinishedCallbacks> callbacks,
     BackgroundSyncError error,
     BackgroundSyncState state) {
   switch (error) {
@@ -396,11 +397,13 @@
           NOTREACHED();
           break;
         case BACKGROUND_SYNC_STATE_SUCCESS:
-          callbacks->onSuccess(true);
+          callbacks->onSuccess();
           break;
         case BACKGROUND_SYNC_STATE_FAILED:
         case BACKGROUND_SYNC_STATE_UNREGISTERED:
-          callbacks->onSuccess(false);
+          callbacks->onError(blink::WebSyncError(
+              blink::WebSyncError::ErrorTypeAbort,
+              "Sync failed, unregistered, or overwritten."));
           break;
       }
       break;
diff --git a/content/child/background_sync/background_sync_provider.h b/content/child/background_sync/background_sync_provider.h
index 66460cf..d88fa44 100644
--- a/content/child/background_sync/background_sync_provider.h
+++ b/content/child/background_sync/background_sync_provider.h
@@ -66,9 +66,9 @@
       blink::WebSyncGetPermissionStatusCallbacks* callbacks) override;
   // TODO(jkarlin): Rename to releaseRegistrationHandle.
   void releaseRegistration(int64_t handle_id) override;
-  void notifyWhenDone(
+  void notifyWhenFinished(
       int64_t handle_id,
-      blink::WebSyncNotifyWhenDoneCallbacks* callbacks) override;
+      blink::WebSyncNotifyWhenFinishedCallbacks* callbacks) override;
 
   void DuplicateRegistrationHandle(
       int64_t handle_id,
@@ -99,8 +99,8 @@
       scoped_ptr<blink::WebSyncGetPermissionStatusCallbacks> callbacks,
       BackgroundSyncError error,
       PermissionStatus status);
-  void NotifyWhenDoneCallback(
-      scoped_ptr<blink::WebSyncNotifyWhenDoneCallbacks> callbacks,
+  void NotifyWhenFinishedCallback(
+      scoped_ptr<blink::WebSyncNotifyWhenFinishedCallbacks> callbacks,
       BackgroundSyncError error,
       BackgroundSyncState state);
 
diff --git a/content/common/background_sync_service.mojom b/content/common/background_sync_service.mojom
index b0bb88c..18d3ac8 100644
--- a/content/common/background_sync_service.mojom
+++ b/content/common/background_sync_service.mojom
@@ -44,7 +44,7 @@
   DuplicateRegistrationHandle(int64 handle_id) 
       => (BackgroundSyncError err, SyncRegistration? registration);  
   ReleaseRegistration(int64 handle_id);
-  NotifyWhenDone(int64 handle_id) => (BackgroundSyncError err, BackgroundSyncState final_status);
+  NotifyWhenFinished(int64 handle_id) => (BackgroundSyncError err, BackgroundSyncState final_status);
 };
 
 interface BackgroundSyncServiceClient {
diff --git a/content/test/data/background_sync/background_sync_test_helpers.js b/content/test/data/background_sync/background_sync_test_helpers.js
index b74694a..b4cd8b6 100644
--- a/content/test/data/background_sync/background_sync_test_helpers.js
+++ b/content/test/data/background_sync/background_sync_test_helpers.js
@@ -157,26 +157,28 @@
     .catch(sendErrorToTest);
 }
 
-function notifyWhenDoneOneShot(tag) {
+function notifyWhenFinishedOneShot(tag) {
   navigator.serviceWorker.ready
     .then(function(swRegistration) {
-      swRegistration.active.postMessage({action: 'notifyWhenDone', tag: tag});
+      swRegistration.active.postMessage(
+          {action: 'notifyWhenFinished', tag: tag});
     })
     .catch(sendErrorToTest);
 }
 
-function notifyWhenDoneImmediateOneShot(tag) {
+function notifyWhenFinishedImmediateOneShot(tag) {
   if (registrationReference == null) {
     sendResultToTest('error - must call storeRegistration first');
     return;
   }
 
-  registrationReference.done
+  registrationReference.finished
     .then(function(success) {
       sendResultToTest('ok - ' + registrationReference.tag +
-                       ' result: ' + success)
+                       ' result: true')
     }, function(err) {
-      sendResultToTest('error - ' + registrationReference.tag + ' failed');
+      sendResultToTest('ok - ' + registrationReference.tag +
+                       ' result: false')
     })
     .catch(sendErrorToTest)
 }
diff --git a/content/test/data/background_sync/service_worker.js b/content/test/data/background_sync/service_worker.js
index bcd0c7a2..6fedae8 100644
--- a/content/test/data/background_sync/service_worker.js
+++ b/content/test/data/background_sync/service_worker.js
@@ -38,17 +38,17 @@
     sendMessageToClients('sync', 'ok - delay rejected');
   }
 
-  if (event.data['action'] === 'notifyWhenDone') {
+  if (event.data['action'] === 'notifyWhenFinished') {
     var tag = event.data['tag'];
     registration.sync.getRegistration(tag)
       .then(function (syncRegistration) {
-        sendMessageToClients('sync', 'ok - ' + tag + ' done');
-        return syncRegistration.done;
+        sendMessageToClients('sync', 'ok - ' + tag + ' finished');
+        return syncRegistration.finished;
       })
-      .then(function(success) {
-        sendMessageToClients('sync', tag + " done result: " + success);
+      .then(function() {
+        sendMessageToClients('sync', tag + " finished result: true");
       }, function(error) {
-        sendMessageToClients('sync', tag + " done result: error");
+        sendMessageToClients('sync', tag + " finished result: false");
       })
       .catch(sendSyncErrorToClients);
   }
diff --git a/media/base/android/media_task_runner.cc b/media/base/android/media_task_runner.cc
index a52919c..8c6d0c63 100644
--- a/media/base/android/media_task_runner.cc
+++ b/media/base/android/media_task_runner.cc
@@ -32,11 +32,20 @@
   const std::string group_name =
       base::FieldTrialList::FindFullName("EnableMediaThreadForMediaPlayback");
 
-  if (base::CommandLine::ForCurrentProcess()->
-      HasSwitch(switches::kEnableMediaThreadForMediaPlayback)) {
+  // Command line switches take precedence over filed trial groups.
+  // The disable switch takes precedence over enable switch.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableMediaThreadForMediaPlayback)) {
+    return false;
+  }
+
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableMediaThreadForMediaPlayback)) {
     return true;
   }
 
+  DVLOG(1) << __FUNCTION__ << ": group_name:'" << group_name << "'";
+
   return base::StartsWith(group_name, "Enabled", base::CompareCase::SENSITIVE);
 }
 
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index d993de6..b989733 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -13,6 +13,10 @@
 const char kVideoThreads[] = "video-threads";
 
 #if defined(OS_ANDROID)
+// Sets the MediaSource player that uses UI thread for frame processing.
+const char kDisableMediaThreadForMediaPlayback[] =
+    "disable-media-thread-for-media-playback";
+
 // Sets the MediaSource player that uses the separate media thread
 const char kEnableMediaThreadForMediaPlayback[] =
     "enable-media-thread-for-media-playback";
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index ac9b65c..03b035e8 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -17,6 +17,7 @@
 MEDIA_EXPORT extern const char kVideoThreads[];
 
 #if defined(OS_ANDROID)
+MEDIA_EXPORT extern const char kDisableMediaThreadForMediaPlayback[];
 MEDIA_EXPORT extern const char kEnableMediaThreadForMediaPlayback[];
 #endif
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_sync/interfaces.html b/third_party/WebKit/LayoutTests/http/tests/background_sync/interfaces.html
index cd4ef6f..c5d4e1b2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/background_sync/interfaces.html
+++ b/third_party/WebKit/LayoutTests/http/tests/background_sync/interfaces.html
@@ -30,7 +30,7 @@
           // FIXME: Assert existence of the attributes when they are properly
           // exposed in the prototype chain. https://crbug.com/43394
 
-          assert_own_property(SyncRegistration.prototype, 'done');
+          assert_own_property(SyncRegistration.prototype, 'finished');
           assert_own_property(SyncRegistration.prototype, 'unregister');
           assert_own_property(SyncRegistration.prototype, 'tag');
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js
index 0b1285a0..e1aa33d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js
@@ -28,7 +28,7 @@
 
     // FIXME: Assert existence of the attributes when they are properly
     // exposed in the prototype chain. https://crbug.com/43394
-    assert_own_property(SyncRegistration.prototype, 'done');
+    assert_own_property(SyncRegistration.prototype, 'finished');
     assert_own_property(SyncRegistration.prototype, 'unregister');
     assert_own_property(SyncRegistration.prototype, 'tag');
 
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 dda5aa1..23cb402 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,7 +603,7 @@
     method permissionState
     method register
 interface SyncRegistration
-    getter done
+    getter finished
     getter tag
     method constructor
     method unregister
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index ffbf1044c..207e1ed 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -5346,7 +5346,7 @@
     method permissionState
     method register
 interface SyncRegistration
-    getter done
+    getter finished
     getter tag
     method constructor
     method unregister
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 2afcc40..fb85c23 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -5744,7 +5744,6 @@
     visitor->trace(m_listsInvalidatedAtDocument);
     for (int i = 0; i < numNodeListInvalidationTypes; ++i)
         visitor->trace(m_nodeLists[i]);
-    visitor->trace(m_cssCanvasElements);
     visitor->trace(m_topLayerElements);
     visitor->trace(m_elemSheet);
     visitor->trace(m_nodeIterators);
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
index 77e329b..2f7e0bb 100644
--- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
@@ -753,10 +753,7 @@
 
 DEFINE_TRACE(HTMLCanvasElement)
 {
-#if ENABLE(OILPAN)
-    visitor->trace(m_observers);
     visitor->trace(m_context);
-#endif
     DocumentVisibilityObserver::trace(visitor);
     HTMLElement::trace(visitor);
 }
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp
index b2063aa2..7d4989b 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp
+++ b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp
@@ -56,7 +56,7 @@
     m_resolver->reject(SyncError::take(m_resolver.get(), error));
 }
 
-SyncNotifyWhenDoneCallbacks::SyncNotifyWhenDoneCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
+SyncNotifyWhenFinishedCallbacks::SyncNotifyWhenFinishedCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
     : m_resolver(resolver)
     , m_serviceWorkerRegistration(serviceWorkerRegistration)
 {
@@ -64,20 +64,20 @@
     ASSERT(m_serviceWorkerRegistration);
 }
 
-SyncNotifyWhenDoneCallbacks::~SyncNotifyWhenDoneCallbacks()
+SyncNotifyWhenFinishedCallbacks::~SyncNotifyWhenFinishedCallbacks()
 {
 }
 
-void SyncNotifyWhenDoneCallbacks::onSuccess(bool status)
+void SyncNotifyWhenFinishedCallbacks::onSuccess()
 {
     if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
         return;
     }
 
-    m_resolver->resolve(status);
+    m_resolver->resolve();
 }
 
-void SyncNotifyWhenDoneCallbacks::onError(const WebSyncError& error)
+void SyncNotifyWhenFinishedCallbacks::onError(const WebSyncError& error)
 {
     if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
         return;
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h
index 54837013..398d13a3 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h
+++ b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h
@@ -47,16 +47,17 @@
 // depending on the result passed to the callback. It takes a
 // ServiceWorkerRegistration in its constructor and will pass it to the
 // SyncProvider.
-class SyncNotifyWhenDoneCallbacks final : public WebSyncNotifyWhenDoneCallbacks {
-    WTF_MAKE_NONCOPYABLE(SyncNotifyWhenDoneCallbacks);
+class SyncNotifyWhenFinishedCallbacks final : public WebSyncNotifyWhenFinishedCallbacks {
+    WTF_MAKE_NONCOPYABLE(SyncNotifyWhenFinishedCallbacks);
     // FIXME(tasak): when making public/platform classes to use PartitionAlloc,
     // the following macro should be moved to WebCallbacks defined in public/platformWebCallbacks.h.
-    WTF_MAKE_FAST_ALLOCATED(SyncNotifyWhenDoneCallbacks);
-public:
-    SyncNotifyWhenDoneCallbacks(ScriptPromiseResolver*, ServiceWorkerRegistration*);
-    ~SyncNotifyWhenDoneCallbacks() override;
+    WTF_MAKE_FAST_ALLOCATED(SyncNotifyWhenFinishedCallbacks);
 
-    void onSuccess(bool) override;
+public:
+    SyncNotifyWhenFinishedCallbacks(ScriptPromiseResolver*, ServiceWorkerRegistration*);
+    ~SyncNotifyWhenFinishedCallbacks() override;
+
+    void onSuccess() override;
     void onError(const WebSyncError&) override;
 
 private:
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncRegistration.cpp b/third_party/WebKit/Source/modules/background_sync/SyncRegistration.cpp
index 9075288..988d5b0 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncRegistration.cpp
+++ b/third_party/WebKit/Source/modules/background_sync/SyncRegistration.cpp
@@ -50,7 +50,7 @@
     syncProvider->releaseRegistration(m_id);
 }
 
-ScriptPromise SyncRegistration::done(ScriptState* scriptState)
+ScriptPromise SyncRegistration::finished(ScriptState* scriptState)
 {
     if (m_id == WebSyncRegistration::UNREGISTERED_SYNC_ID)
         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - not a valid registration object"));
@@ -61,7 +61,7 @@
     WebSyncProvider* webSyncProvider = Platform::current()->backgroundSyncProvider();
     ASSERT(webSyncProvider);
 
-    webSyncProvider->notifyWhenDone(m_id, new SyncNotifyWhenDoneCallbacks(resolver, m_serviceWorkerRegistration));
+    webSyncProvider->notifyWhenFinished(m_id, new SyncNotifyWhenFinishedCallbacks(resolver, m_serviceWorkerRegistration));
 
     return promise;
 }
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncRegistration.h b/third_party/WebKit/Source/modules/background_sync/SyncRegistration.h
index e36bed1..18bc05d6 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncRegistration.h
+++ b/third_party/WebKit/Source/modules/background_sync/SyncRegistration.h
@@ -30,7 +30,7 @@
     String tag() const { return m_tag; }
     void setTag(String value) { m_tag = value; }
 
-    ScriptPromise done(ScriptState*);
+    ScriptPromise finished(ScriptState*);
     ScriptPromise unregister(ScriptState*);
 
     DECLARE_TRACE();
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncRegistration.idl b/third_party/WebKit/Source/modules/background_sync/SyncRegistration.idl
index f625bd3..56db134 100644
--- a/third_party/WebKit/Source/modules/background_sync/SyncRegistration.idl
+++ b/third_party/WebKit/Source/modules/background_sync/SyncRegistration.idl
@@ -8,6 +8,6 @@
     RuntimeEnabled=BackgroundSync,
 ] interface SyncRegistration {
     readonly attribute DOMString tag;
-    [CallWith=ScriptState] readonly attribute Promise<boolean> done;
+    [CallWith=ScriptState] readonly attribute Promise<void> finished;
     [CallWith=ScriptState] Promise<boolean> unregister();
 };
diff --git a/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h b/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h
index 5691955e..890ffbb 100644
--- a/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h
+++ b/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h
@@ -18,7 +18,7 @@
 
 class WebServiceWorkerRegistration;
 using WebSyncRegistrationCallbacks = WebCallbacks<WebPassOwnPtr<WebSyncRegistration>, const WebSyncError&>;
-using WebSyncNotifyWhenDoneCallbacks = WebCallbacks<bool, const WebSyncError&>;
+using WebSyncNotifyWhenFinishedCallbacks = WebCallbacks<void, const WebSyncError&>;
 using WebSyncUnregistrationCallbacks = WebCallbacks<bool, const WebSyncError&>;
 using WebSyncGetRegistrationsCallbacks = WebCallbacks<const WebVector<WebSyncRegistration*>&, const WebSyncError&>;
 using WebSyncGetPermissionStatusCallbacks = WebCallbacks<WebSyncPermissionStatus, const WebSyncError&>;
@@ -47,8 +47,8 @@
     // Does not take ownership of the WebServiceWorkerRegistration.
     virtual void getPermissionStatus(blink::WebSyncRegistration::Periodicity, WebServiceWorkerRegistration*, WebSyncGetPermissionStatusCallbacks*) = 0;
 
-    // Takes ownership of the WebSyncNotifyWhenDoneCallbacks.
-    virtual void notifyWhenDone(int64_t handleId, WebSyncNotifyWhenDoneCallbacks*) = 0;
+    // Takes ownership of the WebSyncNotifyWhenFinishedCallbacks.
+    virtual void notifyWhenFinished(int64_t handleId, WebSyncNotifyWhenFinishedCallbacks*) = 0;
 
     virtual void releaseRegistration(int64_t handleId) = 0;
 };
diff --git a/third_party/libc++-static/build.sh b/third_party/libc++-static/build.sh
index 96d490c..d79054d0 100755
--- a/third_party/libc++-static/build.sh
+++ b/third_party/libc++-static/build.sh
@@ -38,16 +38,16 @@
 sed -i '' 's/push(default)/push(hidden)/g' ../../libcxxabi/src/*
 
 # Let the default handler not depend on __cxa_demangle, this saves 0.5MB binary
-# size in each binary linking against libc++-static.a
+# size in each binary linking against libc++.a
 patch -d ../../libcxxabi -p0 < "${THIS_DIR}/libcxxabi.patch"
 
 "$CXX" -c -I../../libcxx/include/ -I../../libcxxabi/include ../../libcxxabi/src/*.cpp $FLAGS
 popd
 
-libtool -static -o libc++-static.a libcxx*/*.o
+libtool -static -o libc++.a libcxx*/*.o
 
-cp libc++-static.a "${THIS_DIR}"
-upload_to_google_storage.py -b chromium-libcpp "${THIS_DIR}/libc++-static.a"
+cp libc++.a "${THIS_DIR}/libc++.a"
+upload_to_google_storage.py -b chromium-libcpp "${THIS_DIR}/libc++.a"
 
 popd
 rm -rf "${DIR}"
diff --git a/third_party/libc++-static/libc++-static.a.sha1 b/third_party/libc++-static/libc++.a.sha1
similarity index 100%
rename from third_party/libc++-static/libc++-static.a.sha1
rename to third_party/libc++-static/libc++.a.sha1
diff --git a/tools/perf/find_dependencies b/tools/perf/find_dependencies
new file mode 100755
index 0000000..2d0691a88
--- /dev/null
+++ b/tools/perf/find_dependencies
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+# Copyright 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.
+
+import sys
+
+from core import path_util
+sys.path.append(path_util.GetTelemetryDir())
+
+from telemetry.internal.util import find_dependencies
+
+
+if __name__ == '__main__':
+  find_dependencies.FindDependenciesCommand.main()
diff --git a/tools/perf/run_benchmark b/tools/perf/run_benchmark
index 93d1708..d35126b 100755
--- a/tools/perf/run_benchmark
+++ b/tools/perf/run_benchmark
@@ -3,7 +3,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import os
 import sys
 
 from core import path_util
diff --git a/tools/telemetry/find_dependencies b/tools/telemetry/find_dependencies
index b6ebd4b9..c8ec251 100755
--- a/tools/telemetry/find_dependencies
+++ b/tools/telemetry/find_dependencies
@@ -3,8 +3,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from telemetry import decorators
 from telemetry.internal.util import find_dependencies
 
 
-if __name__ == '__main__':
+@decorators.Deprecated(2015, 11, 23, 'Please use tools/perf/find_dependencies.')
+def main():
   find_dependencies.FindDependenciesCommand.main()
+
+
+if __name__ == '__main__':
+  main()